home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Kompresni & kodovaci programy / ucl-0.91 / acconfig / shtool < prev   
Text File  |  2000-04-05  |  87KB  |  2,771 lines

  1. #!/bin/sh
  2. ##
  3. ##  GNU shtool -- The GNU Portable Shell Tool
  4. ##  Copyright (c) 1994-2000 Ralf S. Engelschall <rse@engelschall.com>
  5. ##
  6. ##  See http://www.gnu.org/software/shtool/ for more information.
  7. ##  See ftp://ftp.gnu.org/gnu/shtool/ for latest version.
  8. ##
  9. ##  Version 1.4.8 (12-Mar-2000)
  10. ##  Ingredients: all available modules
  11. ##
  12.  
  13. ##
  14. ##  This program is free software; you can redistribute it and/or modify
  15. ##  it under the terms of the GNU General Public License as published by
  16. ##  the Free Software Foundation; either version 2 of the License, or
  17. ##  (at your option) any later version.
  18. ##
  19. ##  This program is distributed in the hope that it will be useful,
  20. ##  but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. ##  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  22. ##  General Public License for more details.
  23. ##
  24. ##  You should have received a copy of the GNU General Public License
  25. ##  along with this program; if not, write to the Free Software
  26. ##  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  27. ##  USA, or contact Ralf S. Engelschall <rse@engelschall.com>.
  28. ##
  29. ##  Notice: Given that you include this file verbatim into your own
  30. ##  source tree, you are justified in saying that it remains separate
  31. ##  from your package, and that this way you are simply just using GNU
  32. ##  shtool. So, in this situation, there is no requirement that your
  33. ##  package itself is licensed under the GNU General Public License in
  34. ##  order to take advantage of GNU shtool.
  35. ##
  36.  
  37. ##
  38. ##  Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]
  39. ##
  40. ##  Available commands:
  41. ##    echo       Print string with optional construct expansion
  42. ##    mdate      Pretty-print modification time of a file or dir
  43. ##    table      Pretty print a field-separated list as a table
  44. ##    prop       Display progress with a running propeller
  45. ##    move       Move files with simultan substitution
  46. ##    install    Install a program, script or datafile
  47. ##    mkdir      Make one or more directories
  48. ##    mkln       Make link with calculation of relative paths
  49. ##    mkshadow   Make a shadow tree
  50. ##    fixperm    Fix file permissions inside a source tree
  51. ##    tarball    Roll distribution tarballs
  52. ##    guessos    Simple OS/platform guesser
  53. ##    arx        Extended archive command
  54. ##    slo        Separate linker options by library class
  55. ##    scpp       Sharing C Pre-Processor
  56. ##    version    Generate and maintain a version information file
  57. ##    path       Deal with program paths
  58. ##
  59.  
  60. if [ $# -eq 0 ]; then
  61.     echo "$0:Error: invalid command line" 1>&2
  62.     echo "$0:Hint:  run \`$0 -h' for usage" 1>&2
  63.     exit 1
  64. fi
  65. if [ ".$1" = ".-h" -o ".$1" = ".--help" ]; then
  66.     echo "This is GNU shtool, version 1.4.8 (12-Mar-2000)"
  67.     echo "Copyright (c) 1994-2000 Ralf S. Engelschall <rse@engelschall.com>"
  68.     echo "Report bugs to <bug-shtool@gnu.org>"
  69.     echo ''
  70.     echo "Usage: shtool [<options>] [<cmd-name> [<cmd-options>] [<cmd-args>]]"
  71.     echo ''
  72.     echo 'Available global <options>:'
  73.     echo '  -v, --version   display shtool version information'
  74.     echo '  -h, --help      display shtool usage help page (this one)'
  75.     echo '  -d, --debug     display shell trace information'
  76.     echo ''
  77.     echo 'Available <cmd-name> [<cmd-options>] [<cmd-args>]:'
  78.     echo '  echo     [-n] [-e] [<str> ...]'
  79.     echo '  mdate    [-n] [-z] [-s] [-d] [-f<str>] [-o<spec>] <path>'
  80.     echo '  table    [-F<sep>] [-w<width>] [-c<cols>] [-s<strip>] <str><sep><str>...'
  81.     echo '  prop     [-p<str>]'
  82.     echo '  move     [-v] [-t] [-e] [-p] <src-file> <dst-file>'
  83.     echo '  install  [-v] [-t] [-c] [-C] [-s] [-m<mode>] [-o<owner>] [-g<group>]'
  84.     echo '           [-e<ext>] <file> <path>'
  85.     echo '  mkdir    [-t] [-f] [-p] [-m<mode>] <dir> [<dir> ...]'
  86.     echo '  mkln     [-t] [-f] [-s] <src-path> [<src-path> ...] <dst-path>'
  87.     echo '  mkshadow [-v] [-t] [-a] <src-dir> <dst-dir>'
  88.     echo '  fixperm  [-v] [-t] <path> [<path> ...]'
  89.     echo '  tarball  [-t] [-v] [-o <tarball>] [-c <prog>] [-d <dir>] [-u'
  90.     echo '           <user>] [-g <group>] [-e <pattern>] <path> [<path> ...]'
  91.     echo '  guessos  '
  92.     echo '  arx      [-t] [-C<cmd>] <op> <archive> [<file> ...]'
  93.     echo '  slo      -- -L<dir> -l<lib> [ -L<dir> -l<lib> ... ]'
  94.     echo '  scpp     [-v] [-p] [-o<ofile>] [-t<tfile>] [-M<mark>] [-D<dname>]'
  95.     echo '           [-C<cname>] <file> [<file> ...]'
  96.     echo '  version  [-l<lang>] [-n<name>] [-p<prefix>] [-s<version>] [-i<knob>]'
  97.     echo '           [-d<type>] <file>'
  98.     echo '  path     [-s] [-r] [-d] [-b] [-m] [-p<path>] <str> [<str> ...]'
  99.     echo ''
  100.     exit 0
  101. fi
  102. if [ ".$1" = ".-v" -o ".$1" = ."--version" ]; then
  103.     echo "GNU shtool 1.4.8 (12-Mar-2000)"
  104.     exit 0
  105. fi
  106. if [ ".$1" = ".-d" -o ".$1" = ."--debug" ]; then
  107.     shift
  108.     set -x
  109. fi
  110. name=`echo "$0" | sed -e 's;.*/\([^/]*\)$;\1;' -e 's;-sh$;;' -e 's;\.sh$;;'`
  111. case "$name" in
  112.     echo|mdate|table|prop|move|install|mkdir|mkln|mkshadow|fixperm|tarball|guessos|arx|slo|scpp|version|path )
  113.         #   implicit tool command selection
  114.         tool="$name"
  115.         ;;
  116.     * )
  117.         #   explicit tool command selection
  118.         tool="$1"
  119.         shift
  120.         ;;
  121. esac
  122. arg_spec=""
  123. opt_spec=""
  124. gen_tmpfile=no
  125.  
  126. ##
  127. ##  DISPATCH INTO SCRIPT PROLOG
  128. ##
  129.  
  130. case $tool in
  131.     echo )
  132.         str_tool="echo"
  133.         str_usage="[-n] [-e] [<str> ...]"
  134.         arg_spec="0+"
  135.         opt_spec="n.e."
  136.         opt_n=no
  137.         opt_e=no
  138.         ;;
  139.     mdate )
  140.         str_tool="mdate"
  141.         str_usage="[-n] [-z] [-s] [-d] [-f<str>] [-o<spec>] <path>"
  142.         arg_spec="1="
  143.         opt_spec="n.z.s.d.f:o:"
  144.         opt_n=no
  145.         opt_z=no
  146.         opt_s=no
  147.         opt_d=no
  148.         opt_f=" "
  149.         opt_o="dmy"
  150.         ;;
  151.     table )
  152.         str_tool="table"
  153.         str_usage="[-F<sep>] [-w<width>] [-c<cols>] [-s<strip>] <str><sep><str>..."
  154.         arg_spec="1+"
  155.         opt_spec="F:w:c:s:"
  156.         opt_F=":"
  157.         opt_w=15
  158.         opt_c=3
  159.         opt_s=79
  160.         ;;
  161.     prop )
  162.         str_tool="prop"
  163.         str_usage="[-p<str>]"
  164.         arg_spec="0="
  165.         opt_spec="p:"
  166.         opt_p=""
  167.         ;;
  168.     move )
  169.         str_tool="move"
  170.         str_usage="[-v] [-t] [-e] [-p] <src-file> <dst-file>"
  171.         arg_spec="2="
  172.         opt_spec="v.t.e.p."
  173.         opt_v=no
  174.         opt_t=no
  175.         opt_e=no
  176.         opt_p=no
  177.         ;;
  178.     install )
  179.         str_tool="install"
  180.         str_usage="[-v] [-t] [-c] [-C] [-s] [-m<mode>] [-o<owner>] [-g<group>] [-e<ext>] <file> <path>"
  181.         arg_spec="2="
  182.         opt_spec="v.t.c.C.s.m:o:g:e:"
  183.         opt_v=no
  184.         opt_t=no
  185.         opt_c=no
  186.         opt_C=no
  187.         opt_s=no
  188.         opt_m=""
  189.         opt_o=""
  190.         opt_g=""
  191.         opt_e=""
  192.         ;;
  193.     mkdir )
  194.         str_tool="mkdir"
  195.         str_usage="[-t] [-f] [-p] [-m<mode>] <dir> [<dir> ...]"
  196.         arg_spec="1+"
  197.         opt_spec="t.f.p.m:"
  198.         opt_t=no
  199.         opt_f=no
  200.         opt_p=no
  201.         opt_m=""
  202.         ;;
  203.     mkln )
  204.         str_tool="mkln"
  205.         str_usage="[-t] [-f] [-s] <src-path> [<src-path> ...] <dst-path>"
  206.         arg_spec="2+"
  207.         opt_spec="t.f.s."
  208.         opt_t=no
  209.         opt_f=no
  210.         opt_s=no
  211.         ;;
  212.     mkshadow )
  213.         str_tool="mkshadow"
  214.         str_usage="[-v] [-t] [-a] <src-dir> <dst-dir>"
  215.         arg_spec="2="
  216.         opt_spec="v.t.a."
  217.         opt_v=no
  218.         opt_t=no
  219.         opt_a=no
  220.         ;;
  221.     fixperm )
  222.         str_tool="fixperm"
  223.         str_usage="[-v] [-t] <path> [<path> ...]"
  224.         gen_tmpfile=yes
  225.         arg_spec="1+"
  226.         opt_spec="v.t."
  227.         opt_v=no
  228.         opt_t=no
  229.         ;;
  230.     tarball )
  231.         str_tool="tarball"
  232.         str_usage="[-t] [-v] [-o <tarball>] [-c <prog>] [-d <dir>] [-u <user>] [-g <group>] [-e <pattern>] <path> [<path> ...]"
  233.         gen_tmpfile=yes
  234.         arg_spec="1+"
  235.         opt_spec="t.v.o:c:d:u:g:e:"
  236.         opt_t=no
  237.         opt_v=no
  238.         opt_o=""
  239.         opt_c=""
  240.         opt_d=""
  241.         opt_u=""
  242.         opt_g=""
  243.         opt_e="CVS,\\.cvsignore,\\.[oa]\$"
  244.         ;;
  245.     guessos )
  246.         str_tool="guessos"
  247.         str_usage=""
  248.         arg_spec="0="
  249.         opt_spec=""
  250.         ;;
  251.     arx )
  252.         str_tool="arx"
  253.         str_usage="[-t] [-C<cmd>] <op> <archive> [<file> ...]"
  254.         arg_spec="2+"
  255.         opt_spec="t.C:"
  256.         opt_t=no
  257.         opt_C="ar"
  258.         ;;
  259.     slo )
  260.         str_tool="slo"
  261.         str_usage="-- -L<dir> -l<lib> [ -L<dir> -l<lib> ... ]"
  262.         arg_spec="1+"
  263.         opt_spec=""
  264.         ;;
  265.     scpp )
  266.         str_tool="scpp"
  267.         str_usage="[-v] [-p] [-o<ofile>] [-t<tfile>] [-M<mark>] [-D<dname>] [-C<cname>] <file> [<file> ...]"
  268.         gen_tmpfile=yes
  269.         arg_spec="1+"
  270.         opt_spec="v.p.o:t:M:D:C:"
  271.         opt_v=no
  272.         opt_p=no
  273.         opt_o="lib.h"
  274.         opt_t="lib.h.in"
  275.         opt_M="%%MARK%%"
  276.         opt_D="cpp"
  277.         opt_C="intern"
  278.         ;;
  279.     version )
  280.         str_tool="version"
  281.         str_usage="[-l<lang>] [-n<name>] [-p<prefix>] [-s<version>] [-i<knob>] [-d<type>] <file>"
  282.         arg_spec="1+"
  283.         opt_spec="l:n:p:s:i:d:"
  284.         opt_l="txt"
  285.         opt_n="unknown"
  286.         opt_p="unknown"
  287.         opt_s="unknown"
  288.         opt_i="P"
  289.         opt_d="NO"
  290.         gen_tmpfile=yes
  291.         ;;
  292.     path )
  293.         str_tool="path"
  294.         str_usage="[-s] [-r] [-d] [-b] [-m] [-p<path>] <str> [<str> ...]"
  295.         gen_tmpfile=yes
  296.         arg_spec="1+"
  297.         opt_spec="s.r.d.b.m.p:"
  298.         opt_s=no
  299.         opt_r=no
  300.         opt_d=no
  301.         opt_b=no
  302.         opt_m=no
  303.         opt_p="$PATH"
  304.         ;;
  305.     -* )
  306.         echo "$0:Error: unknown option \`$tool'" 2>&1
  307.         echo "$0:Hint:  run \`$0 -h' for usage" 2>&1
  308.         exit 1
  309.         ;;
  310.     * )
  311.         echo "$0:Error: unknown command \`$tool'" 2>&1
  312.         echo "$0:Hint:  run \`$0 -h' for usage" 2>&1
  313.         exit 1
  314.         ;;
  315. esac
  316.  
  317. ##
  318. ##  COMMON UTILITY CODE
  319. ##
  320.  
  321. #   determine name of tool
  322. if [ ".$tool" != . ]; then
  323.     #   used inside shtool script
  324.     toolcmd="$0 $tool"
  325.     toolcmdhelp="shtool $tool"
  326.     msgprefix="shtool:$tool"
  327. else
  328.     #   used as standalone script
  329.     toolcmd="$0"
  330.     toolcmdhelp="sh $0"
  331.     msgprefix="$str_tool"
  332. fi
  333.  
  334. #   parse argument specification string
  335. eval `echo $arg_spec |\
  336.       sed -e 's/^\([0-9]*\)\([+=]\)/arg_NUMS=\1; arg_MODE=\2/'`
  337.  
  338. #   parse option specification string
  339. eval `echo h.$opt_spec |\
  340.       sed -e 's/\([a-zA-Z0-9]\)\([.:+]\)/opt_MODE_\1=\2;/g'`
  341.  
  342. #   interate over argument line
  343. opt_PREV=''
  344. while [ $# -gt 0 ]; do
  345.     #   special option stops processing
  346.     if [ ".$1" = ".--" ]; then
  347.         shift
  348.         break
  349.     fi
  350.  
  351.     #   determine option and argument
  352.     opt_ARG_OK=no
  353.     if [ ".$opt_PREV" != . ]; then
  354.         #   merge previous seen option with argument
  355.         opt_OPT="$opt_PREV"
  356.         opt_ARG="$1"
  357.         opt_ARG_OK=yes
  358.         opt_PREV=''
  359.     else
  360.         #   split argument into option and argument
  361.         case "$1" in
  362.             -[a-zA-Z0-9]*)
  363.                 eval `echo "x$1" |\
  364.                       sed -e 's/^x-\([a-zA-Z0-9]\)/opt_OPT="\1";/' \
  365.                           -e 's/";\(.*\)$/"; opt_ARG="\1"/'`
  366.                 ;;
  367.             -[a-zA-Z0-9])
  368.                 opt_OPT=`echo "x$1" | cut -c3-`
  369.                 opt_ARG=''
  370.                 ;;
  371.             *)
  372.                 break
  373.                 ;;
  374.         esac
  375.     fi
  376.  
  377.     #   eat up option
  378.     shift
  379.  
  380.     #   determine whether option needs an argument
  381.     eval "opt_MODE=\$opt_MODE_${opt_OPT}"
  382.     if [ ".$opt_ARG" = . -a ".$opt_ARG_OK" != .yes ]; then
  383.         if [ ".$opt_MODE" = ".:" -o ".$opt_MODE" = ".+" ]; then
  384.             opt_PREV="$opt_OPT"
  385.             continue
  386.         fi
  387.     fi
  388.  
  389.     #   process option
  390.     case $opt_MODE in
  391.         '.' )
  392.             #   boolean option
  393.             eval "opt_${opt_OPT}=yes"
  394.             ;;
  395.         ':' )
  396.             #   option with argument (multiple occurances override)
  397.             eval "opt_${opt_OPT}=\"\$opt_ARG\""
  398.             ;;
  399.         '+' )
  400.             #   option with argument (multiple occurances append)
  401.             eval "opt_${opt_OPT}=\"\$opt_${opt_OPT} \$opt_ARG\""
  402.             ;;
  403.         * )
  404.             echo "$msgprefix:Error: unknown option: \`-$opt_OPT'" 1>&2
  405.             echo "$msgprefix:Hint:  run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2
  406.             exit 1
  407.             ;;
  408.     esac
  409. done
  410. if [ ".$opt_PREV" != . ]; then
  411.     echo "$msgprefix:Error: missing argument to option \`-$opt_PREV'" 1>&2
  412.     echo "$msgprefix:Hint:  run \`$toolcmdhelp -h' or \`man shtool' for details" 1>&2
  413.     exit 1
  414. fi
  415.  
  416. #   process help option
  417. if [ ".$opt_h" = .yes ]; then
  418.     echo "Usage: $toolcmdhelp $str_usage"
  419.     exit 0
  420. fi
  421.  
  422. #   complain about incorrect number of arguments
  423. case $arg_MODE in
  424.     '=' )
  425.         if [ $# -ne $arg_NUMS ]; then
  426.             echo "$msgprefix:Error: invalid number of arguments (exactly $arg_NUMS expected)" 1>&2
  427.             echo "$msgprefix:Hint:  run \`$toolcmd -h' or \`man shtool' for details" 1>&2
  428.             exit 1
  429.         fi
  430.         ;;
  431.     '+' )
  432.         if [ $# -lt $arg_NUMS ]; then
  433.             echo "$msgprefix:Error: invalid number of arguments (at least $arg_NUMS expected)" 1>&2
  434.             echo "$msgprefix:Hint:  run \`$toolcmd -h' or \`man shtool' for details" 1>&2
  435.             exit 1
  436.         fi
  437.         ;;
  438. esac
  439.  
  440. #   establish a temporary file on request
  441. if [ ".$gen_tmpfile" = .yes ]; then
  442.     if [ ".$TMPDIR" != . ]; then
  443.         tmpdir="$TMPDIR"
  444.     elif [ ".$TEMPDIR" != . ]; then
  445.         tmpdir="$TEMPDIR"
  446.     else
  447.         tmpdir="/tmp"
  448.     fi
  449.     tmpfile="$tmpdir/.shtool.$$"
  450.     rm -f $tmpfile >/dev/null 2>&1
  451.     touch $tmpfile
  452. fi
  453.  
  454. ##
  455. ##  DISPATCH INTO SCRIPT BODY
  456. ##
  457.  
  458. case $tool in
  459.  
  460. echo )
  461.     ##
  462.     ##  echo -- Print string with optional construct expansion
  463.     ##  Copyright (c) 1998-2000 Ralf S. Engelschall <rse@engelschall.com>
  464.     ##  Originally written for WML as buildinfo
  465.     ##
  466.  
  467.     text="$*"
  468.  
  469.     #   check for broken escape sequence expansion
  470.     seo=''
  471.     bytes=`echo '\1' | wc -c | awk '{ printf("%s", $1); }'`
  472.     if [ ".$bytes" != .3 ]; then
  473.         bytes=`echo -E '\1' | wc -c | awk '{ printf("%s", $1); }'`
  474.         if [ ".$bytes" = .3 ]; then
  475.             seo='-E'
  476.         fi
  477.     fi
  478.  
  479.     #   check for existing -n option (to suppress newline)
  480.     minusn=''
  481.     bytes=`echo -n 123 2>/dev/null | wc -c | awk '{ printf("%s", $1); }'`
  482.     if [ ".$bytes" = .3 ]; then
  483.         minusn='-n'
  484.     fi
  485.  
  486.     #   determine terminal bold sequence
  487.     term_bold=''
  488.     term_norm=''
  489.     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[Bb]'`" != . ]; then
  490.         #   the most important terminals we directly know
  491.         case $TERM in
  492.             xterm|xterm*|vt220|vt220*)
  493.                 term_bold=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' </dev/null 2>/dev/null`
  494.                 term_norm=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' </dev/null 2>/dev/null`
  495.                 ;;
  496.             vt100|vt100*)
  497.                 term_bold=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' </dev/null 2>/dev/null`
  498.                 term_norm=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' </dev/null 2>/dev/null`
  499.                 ;;
  500.         esac
  501.         #   then try a possibly existing "tput" or "tcout" utility
  502.         paths=`echo $PATH | sed -e 's/:/ /g'`
  503.         for tool in tput tcout; do
  504.             for dir in $paths; do
  505.                 if [ -r "$dir/$tool" ]; then
  506.                     for seq in bold md smso; do # smso is last
  507.                         bold="`$dir/$tool $seq 2>/dev/null`"
  508.                         if [ ".$bold" != . ]; then
  509.                             term_bold="$bold"
  510.                             break
  511.                         fi
  512.                     done
  513.                     if [ ".$term_bold" != . ]; then
  514.                         for seq in sgr0 me rmso reset; do # 'reset' is last
  515.                             norm="`$dir/$tool $seq 2>/dev/null`"
  516.                             if [ ".$norm" != . ]; then
  517.                                 term_norm="$norm"
  518.                                 break
  519.                             fi
  520.                         done
  521.                     fi
  522.                     break
  523.                 fi
  524.             done
  525.             if [ ".$term_bold" != . -a ".$term_norm" != . ]; then
  526.                 break;
  527.             fi
  528.         done
  529.         if [ ".$term_bold" = . -o ".$term_norm" = . ]; then
  530.             echo "$msgprefix:Warning: unable to determine terminal sequence for bold mode" 1>&2
  531.         fi
  532.     fi
  533.  
  534.     #   determine user name
  535.     username=''
  536.     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[uU]'`" != . ]; then
  537.         username="$LOGNAME"
  538.         if [ ".$username" = . ]; then
  539.             username="$USER"
  540.             if [ ".$username" = . ]; then
  541.                 username="`(whoami) 2>/dev/null |\
  542.                            awk '{ printf("%s", $1); }'`"
  543.                 if [ ".$username" = . ]; then
  544.                     username="`(who am i) 2>/dev/null |\
  545.                                awk '{ printf("%s", $1); }'`"
  546.                     if [ ".$username" = . ]; then
  547.                         username='unknown'
  548.                     fi
  549.                 fi
  550.             fi
  551.         fi
  552.     fi
  553.  
  554.     #   determine user id
  555.     userid=''
  556.     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%U'`" != . ]; then
  557.         userid="`(id -u) 2>/dev/null`"
  558.         if [ ".$userid" = . ]; then
  559.             str="`(id) 2>/dev/null`"
  560.             if [ ".`echo $str | grep '^uid[     ]*=[     ]*[0-9]*('`" != . ]; then
  561.                 userid=`echo $str | sed -e 's/^uid[     ]*=[     ]*//' -e 's/(.*//'`
  562.             fi
  563.             if [ ".$userid" = . ]; then
  564.                 userid=`egrep "^${username}:" /etc/passwd 2>/dev/null | \
  565.                         sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
  566.                 if [ ".$userid" = . ]; then
  567.                     userid=`(ypcat passwd) 2>/dev/null |
  568.                             egrep "^${username}:" | \
  569.                             sed -e 's/[^:]*:[^:]*://' -e 's/:.*$//'`
  570.                     if [ ".$userid" = . ]; then
  571.                         userid='?'
  572.                     fi
  573.                 fi
  574.             fi
  575.         fi
  576.     fi
  577.  
  578.     #   determine host name
  579.     hostname=''
  580.     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%h'`" != . ]; then
  581.         hostname="`(uname -n) 2>/dev/null |\
  582.                    awk '{ printf("%s", $1); }'`"
  583.         if [ ".$hostname" = . ]; then
  584.             hostname="`(hostname) 2>/dev/null |\
  585.                        awk '{ printf("%s", $1); }'`"
  586.             if [ ".$hostname" = . ]; then
  587.                 hostname='unknown'
  588.             fi
  589.         fi
  590.         case $hostname in
  591.             *.* )
  592.                 domainname=".`echo $hostname | cut -d. -f2-`"
  593.                 hostname="`echo $hostname | cut -d. -f1`"
  594.                 ;;
  595.         esac
  596.     fi
  597.  
  598.     #   determine domain name
  599.     domainname=''
  600.     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%d'`" != . ]; then
  601.         if [ ".$domainname" = . ]; then
  602.             if [ -f /etc/resolv.conf ]; then
  603.                 domainname="`egrep '^[     ]*domain' /etc/resolv.conf | head -1 |\
  604.                              sed -e 's/.*domain//' \
  605.                                  -e 's/^[     ]*//' -e 's/^ *//' -e 's/^    *//' \
  606.                                  -e 's/^\.//' -e 's/^/./' |\
  607.                              awk '{ printf("%s", $1); }'`"
  608.                 if [ ".$domainname" = . ]; then
  609.                     domainname="`egrep '^[     ]*search' /etc/resolv.conf | head -1 |\
  610.                                  sed -e 's/.*search//' \
  611.                                      -e 's/^[     ]*//' -e 's/^ *//' -e 's/^    *//' \
  612.                                      -e 's/ .*//' -e 's/    .*//' \
  613.                                      -e 's/^\.//' -e 's/^/./' |\
  614.                                  awk '{ printf("%s", $1); }'`"
  615.                 fi
  616.             fi
  617.         fi
  618.     fi
  619.  
  620.     #   determine current time
  621.     time_day=''
  622.     time_month=''
  623.     time_year=''
  624.     time_monthname=''
  625.     if [ ".$opt_e" = .yes -a ".`echo $text | egrep '%[DMYm]'`" != . ]; then
  626.         time_day=`date '+%d'`
  627.         time_month=`date '+%m'`
  628.         time_year=`date '+%Y' 2>/dev/null`
  629.         if [ ".$time_year" = . ]; then
  630.             time_year=`date '+%y'`
  631.             case $time_year in
  632.                 [5-9][0-9]) time_year="19$time_year" ;;
  633.                 [0-4][0-9]) time_year="20$time_year" ;;
  634.             esac
  635.         fi
  636.         case $time_month in
  637.             1|01) time_monthname='Jan' ;;
  638.             2|02) time_monthname='Feb' ;;
  639.             3|03) time_monthname='Mar' ;;
  640.             4|04) time_monthname='Apr' ;;
  641.             5|05) time_monthname='May' ;;
  642.             6|06) time_monthname='Jun' ;;
  643.             7|07) time_monthname='Jul' ;;
  644.             8|08) time_monthname='Aug' ;;
  645.             9|09) time_monthname='Sep' ;;
  646.               10) time_monthname='Oct' ;;
  647.               11) time_monthname='Nov' ;;
  648.               12) time_monthname='Dec' ;;
  649.         esac
  650.     fi
  651.  
  652.     #   expand special ``%x'' constructs
  653.     if [ ".$opt_e" = .yes ]; then
  654.         text=`echo $seo "$text" |\
  655.               sed -e "s/%B/${term_bold}/g" \
  656.                   -e "s/%b/${term_norm}/g" \
  657.                   -e "s/%u/${username}/g" \
  658.                   -e "s/%U/${userid}/g" \
  659.                   -e "s/%h/${hostname}/g" \
  660.                   -e "s/%d/${domainname}/g" \
  661.                   -e "s/%D/${time_day}/g" \
  662.                   -e "s/%M/${time_month}/g" \
  663.                   -e "s/%Y/${time_year}/g" \
  664.                   -e "s/%m/${time_monthname}/g" 2>/dev/null`
  665.     fi
  666.  
  667.     #   create output
  668.     if [ .$opt_n = .no ]; then
  669.         echo $seo "$text"
  670.     else
  671.         #   the harder part: echo -n is best, because
  672.         #   awk complains about some \xx sequences.
  673.         if [ ".$minusn" != . ]; then
  674.             echo $seo $minusn "$text"
  675.         else
  676.             echo dummy | awk '{ printf("%s", TEXT); }' TEXT="$text"
  677.         fi
  678.     fi
  679.     ;;
  680.  
  681. mdate )
  682.     ##
  683.     ##  mdate -- Pretty-print modification time of a file or dir
  684.     ##  Copyright (c) 1995-1997 Free Software Foundation, Inc.
  685.     ##  Originally idea and basis code by Ulrich Drepper
  686.     ##  Enhanced by Ralf S. Engelschall for shtool
  687.     ##
  688.  
  689.     fod="$1"
  690.     case "$opt_o" in
  691.         [dmy][dmy][dmy] )
  692.             ;;
  693.         * ) echo "$msgprefix:Error: invalid argument to option \`-o': $opt_o" 1>&2
  694.             exit 1
  695.             ;;
  696.     esac
  697.     if [ ! -r "$fod" ]; then
  698.         echo "$msgprefix:Error: file or directory not found: $fod" 1>&2
  699.         exit 1
  700.     fi
  701.  
  702.     #   prevent "date" giving response in another language
  703.     LANG=C;    export LANG
  704.     LC_ALL=C;  export LC_ALL
  705.     LC_TIME=C; export LC_TIME
  706.  
  707.     #   get the extended ls output of the file or directory.
  708.     if ls -L /dev/null >/dev/null 2>&1; then
  709.         set - x`ls -L -l -d $fod`
  710.     else
  711.         set - x`ls -l -d $fod`
  712.     fi
  713.  
  714.     #   The month is at least the fourth argument
  715.     #   (3 shifts here, the next inside the loop).
  716.     shift; shift; shift
  717.  
  718.     #   Find the month. Next argument is day, followed by the year or time.
  719.     month=""
  720.     while [ ".$month" = . ]; do
  721.         shift
  722.         case $1 in
  723.             Jan) month=January;   nummonth=1  ;;
  724.             Feb) month=February;  nummonth=2  ;;
  725.             Mar) month=March;     nummonth=3  ;;
  726.             Apr) month=April;     nummonth=4  ;;
  727.             May) month=May;       nummonth=5  ;;
  728.             Jun) month=June;      nummonth=6  ;;
  729.             Jul) month=July;      nummonth=7  ;;
  730.             Aug) month=August;    nummonth=8  ;;
  731.             Sep) month=September; nummonth=9  ;;
  732.             Oct) month=October;   nummonth=10 ;;
  733.             Nov) month=November;  nummonth=11 ;;
  734.             Dec) month=December;  nummonth=12 ;;
  735.         esac
  736.     done
  737.     day="$2"
  738.     year="$3"
  739.  
  740.     #   We finally have to deal with the problem that the "ls" output
  741.     #   gives either the time of the day or the year.
  742.     case $year in
  743.         *:*)
  744.             this_year=`date '+%Y' 2>/dev/null`
  745.             if [ ".$this_year" = . ]; then
  746.                 this_year=`date '+%y'`
  747.                 case $this_year in
  748.                     [5-9][0-9]) this_year="19$this_year" ;;
  749.                     [0-4][0-9]) this_year="20$this_year" ;;
  750.                 esac
  751.             fi
  752.             #   for the following months of the last year the time notation
  753.             #   is usually also used for files modified in the last year.
  754.             this_month=`date '+%m'`
  755.             if (expr $nummonth \> $this_month) >/dev/null; then
  756.                 this_year=`expr $this_year - 1`
  757.             fi
  758.             year="$this_year"
  759.             ;;
  760.     esac
  761.  
  762.     #   Optionally fill day and month with leeding zeros
  763.     if [ ".$opt_z" = .yes ]; then
  764.         case $day in
  765.             [0-9][0-9] ) ;;
  766.                  [0-9] ) day="0$day" ;;
  767.         esac
  768.         case $nummonth in
  769.             [0-9][0-9] ) ;;
  770.                  [0-9] ) nummonth="0$nummonth" ;;
  771.         esac
  772.     fi
  773.  
  774.     #   Optionally use digits for month
  775.     if [ ".$opt_d" = .yes ]; then
  776.         month="$nummonth"
  777.     fi
  778.  
  779.     #   Optionally shorten the month name to three characters
  780.     if [ ".$opt_s" = .yes ]; then
  781.         month=`echo $month | cut -c1-3`
  782.     fi
  783.  
  784.     #   Output the resulting date string
  785.     echo dummy | awk '{
  786.         for (i = 0; i < 3; i++) {
  787.             now = substr(order, 1, 1);
  788.             order = substr(order, 2);
  789.             if (now == "d")
  790.                 out = day;
  791.             else if (now == "m")
  792.                 out = month;
  793.             else if (now == "y")
  794.                 out = year;
  795.             if (i < 2)
  796.                 printf("%s%s", out, field);
  797.             else
  798.                 printf("%s", out);
  799.         }
  800.         if (newline != "yes")
  801.             printf("\n");
  802.     }' "day=$day" "month=$month" "year=$year" \
  803.        "field=$opt_f" "order=$opt_o" "newline=$opt_n"
  804.     ;;
  805.  
  806. table )
  807.     ##
  808.     ##  table -- Pretty print a field-separated list as a table
  809.     ##  Copyright (c) 1998-2000 Ralf S. Engelschall <rse@engelschall.com>
  810.     ##  Originally written for Apache
  811.     ##
  812.  
  813.     if [ $opt_c -gt 4 ]; then
  814.         echo "$msgprefix:Error: Invalid number of colums (1..4 allowed only)" 1>&2
  815.         exit 1
  816.     fi
  817.     case "x$opt_F" in
  818.         x? ) ;;
  819.         *  ) echo "$msgprefix:Error: Invalid separator (one char allowed only)" 1>&2; exit 1 ;;
  820.     esac
  821.  
  822.     #   split the list into a table
  823.     list=`
  824.         IFS="$opt_F"
  825.         for entry in $*; do
  826.             if [ ".$entry" != . ]; then
  827.                 echo "$entry"
  828.             fi
  829.         done |\
  830.         awk "
  831.             BEGIN { list = \"\"; n = 0; }
  832.             {
  833.                 list = list \\$1;
  834.                 n = n + 1;
  835.                 if (n < $opt_c) {
  836.                     list = list \":\";
  837.                 }
  838.                 if (n == $opt_c) {
  839.                     list = list \"\\n\";
  840.                     n = 0;
  841.                 }
  842.             }
  843.             END { print list; }
  844.          "
  845.     `
  846.  
  847.     #   format table cells and make sure table
  848.     #   doesn't exceed maximum width
  849.     OIFS="$IFS"
  850.     IFS='
  851. '
  852.     for entry in $list; do
  853.         case $opt_c in
  854.             1 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s\\n\", \$1); }'" ;;
  855.             2 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s\\n\", \$1, \$2); }'" ;;
  856.             3 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3); }'" ;;
  857.             4 ) eval "echo \"\${entry}\" | awk -F: '{ printf(\"%-${opt_w}s %-${opt_w}s %-${opt_w}s %-${opt_w}s\\n\", \$1, \$2, \$3, \$4); }'" ;;
  858.         esac
  859.     done |\
  860.     awk "{
  861.         if (length(\$0) > $opt_s) {
  862.             printf(\"%s\\n\", substr(\$0, 0, $opt_s-1));
  863.         } else {
  864.             print \$0;
  865.         }
  866.     }"
  867.     IFS="$OIFS"
  868.     ;;
  869.  
  870. prop )
  871.     ##
  872.     ##  prop -- Display progress with a running propeller
  873.     ##  Copyright (c) 1998-2000 Ralf S. Engelschall <rse@engelschall.com>
  874.     ##  Originally written for mod_ssl
  875.     ##
  876.  
  877.     perl=''
  878.     for dir in `echo $PATH | sed -e 's/:/ /g'` .; do
  879.         if [ -f "$dir/perl" ]; then
  880.             perl="$dir/perl"
  881.             break
  882.         fi
  883.     done
  884.     if [ ".$perl" != . ]; then
  885.         #   Perl is preferred because writing to STDERR in
  886.         #   Perl really writes immediately as one would expect
  887.         $perl -e '
  888.             @p = ("|","/","-","\\");
  889.             $i = 0;
  890.             while (<STDIN>) {
  891.                 printf(STDERR "\r%s...%s\b", $ARGV[0], $p[$i++]);
  892.                 $i = 0 if ($i > 3);
  893.             }
  894.             printf(STDERR "\r%s    \n", $ARGV[0]);
  895.         ' "$opt_p"
  896.     else
  897.         #   But when Perl doesn't exists we use Awk even
  898.         #   some Awk's buffer even the /dev/stderr writing :-(
  899.         awk '
  900.             BEGIN {
  901.                 split("|#/#-#\\", p, "#");
  902.                 i = 1;
  903.             }
  904.             {
  905.                 printf("\r%s%c\b", prefix, p[i++]) > "/dev/stderr";
  906.                 if (i > 4) { i = 1; }
  907.             }
  908.             END {
  909.                 printf("\r%s    \n", prefix) > "/dev/stderr";
  910.             }
  911.         ' "prefix=$opt_p"
  912.     fi
  913.     ;;
  914.  
  915. move )
  916.     ##
  917.     ##  move -- Move files with simultan substitution
  918.     ##  Copyright (c) 1999-2000 Ralf S. Engelschall <rse@engelschall.com>
  919.     ##  Originally written for shtool
  920.     ##
  921.  
  922.     src="$1"
  923.     dst="$2"
  924.  
  925.     #   consistency checks
  926.     if [ ".$src" = . -o ".$dst" = . ]; then
  927.         echo "$msgprefix:Error: Invalid arguments" 1>&2
  928.         exit 1
  929.     fi
  930.     if [ ".$src" = ".$dst" ]; then
  931.         echo "$msgprefix:Error: Source and destination files are the same" 1>&2
  932.         exit 1
  933.     fi
  934.     expsrc="$src"
  935.     if [ ".$opt_e" = .yes ]; then
  936.         expsrc="`echo $expsrc`"
  937.     fi
  938.     if [ ".$opt_e" = .yes ]; then
  939.         if [ ".`echo "$src" | sed -e 's;^.*\\*.*$;;'`" = ".$src" ]; then
  940.             echo "$msgprefix:Error: Source doesn't contain wildcard ('*'): $dst" 1>&2
  941.             exit 1
  942.         fi
  943.         if [ ".`echo "$dst" | sed -e 's;^.*%[1-9].*$;;'`" = ".$dst" ]; then
  944.             echo "$msgprefix:Error: Destination doesn't contain substitution ('%N'): $dst" 1>&2
  945.             exit 1
  946.         fi
  947.         if [ ".$expsrc" = ".$src" ]; then
  948.             echo "$msgprefix:Error: Sources not found or no asterisk : $src" 1>&2
  949.             exit 1
  950.         fi
  951.     else
  952.         if [ ! -r "$src" ]; then
  953.             echo "$msgprefix:Error: Source not found: $src" 1>&2
  954.             exit 1
  955.         fi
  956.     fi
  957.  
  958.     #   determine substitution patterns
  959.     if [ ".$opt_e" = .yes ]; then
  960.         srcpat=`echo "$src" | sed -e 's/\\./\\\\./g' -e 's/;/\\;/g' -e 's;\\*;\\\\(.*\\\\);g'`
  961.         dstpat=`echo "$dst" | sed -e 's;%\([1-9]\);\\\\\1;g'`
  962.     fi
  963.  
  964.     #   iterate over source(s)
  965.     for onesrc in $expsrc; do
  966.         if [ .$opt_e = .yes ]; then
  967.             onedst=`echo $onesrc | sed -e "s;$srcpat;$dstpat;"`
  968.         else
  969.             onedst="$dst"
  970.         fi
  971.         errorstatus=0
  972.         if [ ".$opt_v" = .yes ]; then
  973.             echo "$onesrc -> $onedst"
  974.         fi
  975.         if [ ".$opt_p" = .yes ]; then
  976.             if [ -r $onedst ]; then
  977.                 if cmp -s $onesrc $onedst; then
  978.                     if [ ".$opt_t" = .yes ]; then
  979.                         echo "rm -f $onesrc" 1>&2
  980.                     fi
  981.                     rm -f $onesrc || errorstatus=$?
  982.                 else
  983.                     if [ ".$opt_t" = .yes ]; then
  984.                         echo "mv -f $onesrc $onedst" 1>&2
  985.                     fi
  986.                     mv -f $onesrc $onedst || errorstatus=$?
  987.                 fi
  988.             else
  989.                 if [ ".$opt_t" = .yes ]; then
  990.                     echo "mv -f $onesrc $onedst" 1>&2
  991.                 fi
  992.                 mv -f $onesrc $onedst || errorstatus=$?
  993.             fi
  994.         else
  995.             if [ ".$opt_t" = .yes ]; then
  996.                 echo "mv -f $onesrc $onedst" 1>&2
  997.             fi
  998.             mv -f $onesrc $onedst || errorstatus=$?
  999.         fi
  1000.         if [ $errorstatus -ne 0 ]; then
  1001.             break;
  1002.         fi
  1003.     done
  1004.     exit $errorstatus
  1005.     ;;
  1006.  
  1007. install )
  1008.     ##
  1009.     ##  install -- Install a program, script or datafile
  1010.     ##  Copyright (c) 1997-2000 Ralf S. Engelschall <rse@engelschall.com>
  1011.     ##  Originally written for shtool
  1012.     ##
  1013.  
  1014.     src="$1"
  1015.     dst="$2"
  1016.  
  1017.     #  If destination is a directory, append the input filename
  1018.     if [ -d $dst ]; then
  1019.         dst=`echo "$dst" | sed -e 's:/$::'`
  1020.         dstfile=`echo "$src" | sed -e 's;.*/\([^/]*\)$;\1;'`
  1021.         dst="$dst/$dstfile"
  1022.     fi
  1023.  
  1024.     #  Add a possible extension to src and dst
  1025.     if [ ".$opt_e" != . ]; then
  1026.         src="$src$opt_e"
  1027.         dst="$dst$opt_e"
  1028.     fi
  1029.  
  1030.     #  Check for correct arguments
  1031.     if [ ".$src" = ".$dst" ]; then
  1032.         echo "$msgprefix:Error: source and destination are the same" 1>&2
  1033.         exit 1
  1034.     fi
  1035.  
  1036.     #  Make a temp file name in the destination directory
  1037.     dstdir=`echo $dst | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'`
  1038.     dsttmp="$dstdir/#INST@$$#"
  1039.  
  1040.     #  Verbosity
  1041.     if [ ".$opt_v" = .yes ]; then
  1042.         echo "$src -> $dst" 1>&2
  1043.     fi
  1044.  
  1045.     #  Copy or move the file name to the temp name
  1046.     #  (because we might be not allowed to change the source)
  1047.     if [ ".$opt_C" = .yes ]; then
  1048.         opt_c=yes
  1049.     fi
  1050.     if [ ".$opt_c" = .yes ]; then
  1051.         if [ ".$opt_t" = .yes ]; then
  1052.             echo "cp $src $dsttmp" 1>&2
  1053.         fi
  1054.         cp $src $dsttmp || exit $?
  1055.     else
  1056.         if [ ".$opt_t" = .yes ]; then
  1057.             echo "mv $src $dsttmp" 1>&2
  1058.         fi
  1059.         mv $src $dsttmp || exit $?
  1060.     fi
  1061.  
  1062.     #  Adjust the target file
  1063.     #  (we do chmod last to preserve setuid bits)
  1064.     if [ ".$opt_s" = .yes ]; then
  1065.         if [ ".$opt_t" = .yes ]; then
  1066.             echo "strip $dsttmp" 1>&2
  1067.         fi
  1068.         strip $dsttmp || exit $?
  1069.     fi
  1070.     if [ ".$opt_o" != . ]; then
  1071.         if [ ".$opt_t" = .yes ]; then
  1072.             echo "chown $opt_o $dsttmp" 1>&2
  1073.         fi
  1074.         chown $opt_o $dsttmp || exit $?
  1075.     fi
  1076.     if [ ".$opt_g" != . ]; then
  1077.         if [ ".$opt_t" = .yes ]; then
  1078.             echo "chgrp $opt_g $dsttmp" 1>&2
  1079.         fi
  1080.         chgrp $opt_g $dsttmp || exit $?
  1081.     fi
  1082.     if [ ".$opt_m" != . ]; then
  1083.         if [ ".$opt_t" = .yes ]; then
  1084.             echo "chmod $opt_m $dsttmp" 1>&2
  1085.         fi
  1086.         chmod $opt_m $dsttmp || exit $?
  1087.     fi
  1088.  
  1089.     #   Determine whether to do a quick install
  1090.     #   (has to be done _after_ the strip was already done)
  1091.     quick=no
  1092.     if [ ".$opt_C" = .yes ]; then
  1093.         if [ -r $dst ]; then
  1094.             if cmp -s $src $dst; then
  1095.                 quick=yes
  1096.             fi
  1097.         fi
  1098.     fi
  1099.  
  1100.     #   Finally install the file to the real destination
  1101.     if [ $quick = yes ]; then
  1102.         if [ ".$opt_t" = .yes ]; then
  1103.             echo "rm -f $dsttmp" 1>&2
  1104.         fi
  1105.         rm -f $dsttmp
  1106.     else
  1107.         if [ ".$opt_t" = .yes ]; then
  1108.             echo "rm -f $dst && mv $dsttmp $dst" 1>&2
  1109.         fi
  1110.         rm -f $dst && mv $dsttmp $dst
  1111.     fi
  1112.     ;;
  1113.  
  1114. mkdir )
  1115.     ##
  1116.     ##  mkdir -- Make one or more directories
  1117.     ##  Copyright (c) 1996-2000 Ralf S. Engelschall <rse@engelschall.com>
  1118.     ##  Originally written for public domain by Noah Friedman <friedman@prep.ai.mit.edu>
  1119.     ##  Cleaned up and enhanced for shtool
  1120.     ##
  1121.  
  1122.     errstatus=0
  1123.     for p in ${1+"$@"}; do
  1124.         #   when the directory already exists...
  1125.         if [ -d "$p" ]; then
  1126.             if [ ".$opt_f" = .no ]; then
  1127.                 echo "$msgprefix:Error: file exists: $p" 1>&2
  1128.                 errstatus=1
  1129.                 break
  1130.             else
  1131.                 continue
  1132.             fi
  1133.         fi
  1134.         #   when the directory has to be created
  1135.         if [ ".$opt_p" = .no ]; then
  1136.             if [ ".$opt_t" = .yes ]; then
  1137.                 echo "mkdir $p" 1>&2
  1138.             fi
  1139.             mkdir $p || errstatus=$?
  1140.         else
  1141.             #   the smart situation
  1142.             set fnord `echo ":$p" |\
  1143.                        sed -e 's/^:\//%/' \
  1144.                            -e 's/^://' \
  1145.                            -e 's/\// /g' \
  1146.                            -e 's/^%/\//'`
  1147.             shift
  1148.             pathcomp=
  1149.             for d in ${1+"$@"}; do
  1150.                 pathcomp="$pathcomp$d"
  1151.                 case "$pathcomp" in
  1152.                     -* ) pathcomp="./$pathcomp" ;;
  1153.                 esac
  1154.                 if [ ! -d "$pathcomp" ]; then
  1155.                     if [ ".$opt_t" = .yes ]; then
  1156.                         echo "mkdir $pathcomp" 1>&2
  1157.                     fi
  1158.                     mkdir $pathcomp || errstatus=$?
  1159.                     if [ ".$opt_m" != . ]; then
  1160.                         if [ ".$opt_t" = .yes ]; then
  1161.                             echo "chmod $opt_m $pathcomp" 1>&2
  1162.                         fi
  1163.                         chmod $opt_m $pathcomp || errstatus=$?
  1164.                     fi
  1165.                 fi
  1166.                 pathcomp="$pathcomp/"
  1167.             done
  1168.         fi
  1169.     done
  1170.     exit $errstatus
  1171.     ;;
  1172.  
  1173. mkln )
  1174.     ##
  1175.     ##  mkln -- Make link with calculation of relative paths
  1176.     ##  Copyright (c) 1999-2000 Ralf S. Engelschall <rse@engelschall.com>
  1177.     ##  Originally written for shtool
  1178.     ##
  1179.  
  1180.     args=$?
  1181.     srcs=""
  1182.     while [ $# -gt 1 ]; do
  1183.         srcs="$srcs $1"
  1184.         shift
  1185.     done
  1186.     dst="$1"
  1187.     if [ ! -d $dst ]; then
  1188.         if [ $args -gt 2 ]; then
  1189.             echo "$msgprefix:Error: multiple sources not allowed when target isn't a directory" 1>&2
  1190.             exit 1
  1191.         fi
  1192.     fi
  1193.  
  1194.     #   determine link options
  1195.     lnopt=""
  1196.     if [ ".$opt_f" = .yes ]; then
  1197.         lnopt="$lnopt -f"
  1198.     fi
  1199.     if [ ".$opt_s" = .yes ]; then
  1200.         lnopt="$lnopt -s"
  1201.     fi
  1202.  
  1203.     #   iterate over sources
  1204.     for src in $srcs; do
  1205.         #   determine if one of the paths is an absolute path,
  1206.         #   because then we _have_ to use an absolute symlink
  1207.         oneisabs=0
  1208.         srcisabs=0
  1209.         dstisabs=0
  1210.         case $src in
  1211.             /* ) oneisabs=1; srcisabs=1 ;;
  1212.         esac
  1213.         case $dst in
  1214.             /* ) oneisabs=1; dstisabs=1 ;;
  1215.         esac
  1216.  
  1217.         #   split source and destination into dir and base name
  1218.         if [ -d $src ]; then
  1219.             srcdir=`echo $src | sed -e 's;/*$;;'`
  1220.             srcbase=""
  1221.         else
  1222.             srcdir=`echo  $src | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'`
  1223.             srcbase=`echo $src | sed -e 's;.*/\([^/]*\)$;\1;'`
  1224.         fi
  1225.         if [ -d $dst ]; then
  1226.             dstdir=`echo $dst | sed -e 's;/*$;;'`
  1227.             dstbase=""
  1228.         else
  1229.             dstdir=`echo  $dst | sed -e 's;^[^/]*$;;' -e 's;^\(.*/\)[^/]*$;\1;' -e 's;\(.\)/$;\1;'`
  1230.             dstbase=`echo $dst | sed -e 's;.*/\([^/]*\)$;\1;'`
  1231.         fi
  1232.  
  1233.         #   consistency check
  1234.         if [ ".$dstdir" != . ]; then
  1235.             if [ ! -d $dstdir ]; then
  1236.                 echo "$msgprefix:Error: destination directory not found: $dstdir" 1>&2
  1237.                 exit 1
  1238.             fi
  1239.         fi
  1240.  
  1241.         #   make sure the source is reachable from the destination
  1242.         if [ $dstisabs = 1 ]; then
  1243.             if [ $srcisabs = 0 ]; then
  1244.                 if [ -d $srcdir ]; then
  1245.                     srcdir="`cd $srcdir; pwd | sed -e 's;/*$;;'`"
  1246.                     srcisabs=1
  1247.                     oneisabs=1
  1248.                 fi
  1249.             fi
  1250.         fi
  1251.  
  1252.         #   split away a common prefix
  1253.         prefix=""
  1254.         if [ ".$srcdir" = ".$dstdir" ] && [ ".$srcdir" != . ]; then
  1255.             prefix="$srcdir/"
  1256.             srcdir=""
  1257.             dstdir=""
  1258.         else
  1259.             while [ ".$srcdir" != . ] && [ ".$dstdir" != . ]; do
  1260.                 presrc=`echo $srcdir | sed -e 's;^\([^/]*\)/.*;\1;'`
  1261.                 predst=`echo $dstdir | sed -e 's;^\([^/]*\)/.*;\1;'`
  1262.                 if [ ".$presrc" != ".$predst" ]; then
  1263.                     break
  1264.                 fi
  1265.                 prefix="$prefix$presrc/"
  1266.                 srcdir=`echo $srcdir | sed -e 's;^[^/]*/*;;'`
  1267.                 dstdir=`echo $dstdir | sed -e 's;^[^/]*/*;;'`
  1268.             done
  1269.         fi
  1270.  
  1271.         #   destination prefix is just the common prefix
  1272.         dstpre="$prefix"
  1273.  
  1274.         #   determine source prefix which is the reverse directory
  1275.         #   step-up corresponding to the destination directory
  1276.         srcpre=""
  1277.         if [ $oneisabs = 0 ] || [ ".$prefix" != . -a ".$prefix" != ./ ]; then
  1278.             pl="$dstdir/"
  1279.             OIFS="$IFS"; IFS='/'
  1280.             for pe in $pl; do
  1281.                 [ ".$pe" = . ] && continue
  1282.                 srcpre="../$srcpre"
  1283.             done
  1284.             IFS="$OIFS"
  1285.         else
  1286.             if [ $srcisabs = 1 ]; then
  1287.                 srcpre="$prefix"
  1288.             fi
  1289.         fi
  1290.  
  1291.         #   determine destination symlink name
  1292.         if [ ".$dstbase" = . ]; then
  1293.             if [ ".$srcbase" != . ]; then
  1294.                 dstbase="$srcbase"
  1295.             else
  1296.                 dstbase=`echo "$prefix$srcdir" | sed -e 's;/*$;;' -e 's;.*/\([^/]*\)$;\1;'`
  1297.             fi
  1298.         fi
  1299.  
  1300.         #   now finalize source and destination directory paths
  1301.         srcdir=`echo $srcdir | sed -e 's;\([^/]\)$;\1/;'`
  1302.         dstdir=`echo $dstdir | sed -e 's;\([^/]\)$;\1/;'`
  1303.  
  1304.         #   run the final link command
  1305.         if [ ".$opt_t" = .yes ]; then
  1306.             echo "ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase"
  1307.         fi
  1308.         eval ln$lnopt $srcpre$srcdir$srcbase $dstpre$dstdir$dstbase
  1309.     done
  1310.     ;;
  1311.  
  1312. mkshadow )
  1313.     ##
  1314.     ##  mkshadow -- Make a shadow tree
  1315.     ##  Copyright (c) 1998-2000 Ralf S. Engelschall <rse@engelschall.com>
  1316.     ##  Originally written for Apache
  1317.     ##
  1318.  
  1319.     #   source and destination directory
  1320.     src=`echo "$1" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'`
  1321.     dst=`echo "$2" | sed -e 's:/$::' -e 's:^\./\(.\):\1:'`
  1322.  
  1323.     #   check whether source exists
  1324.     if [ ! -d $src ]; then
  1325.         echo "$msgprefix:Error: source directory not found: \`$src'" 1>&2
  1326.         exit 1
  1327.     fi
  1328.  
  1329.     #   determine if one of the paths is an absolute path,
  1330.     #   because then we have to use an absolute symlink
  1331.     oneisabs=0
  1332.     case $src in
  1333.         /* ) oneisabs=1 ;;
  1334.     esac
  1335.     case $dst in
  1336.         /* ) oneisabs=1 ;;
  1337.     esac
  1338.  
  1339.     #   determine reverse directory for destination directory
  1340.     dstrevdir=''
  1341.     if [ $oneisabs = 0 ]; then
  1342.         #   derive reverse path from forward path
  1343.         pwd=`pwd`
  1344.         OIFS="$IFS"; IFS='/'
  1345.         for pe in $dst; do
  1346.             if [ "x$pe" = "x.." ]; then
  1347.                 OIFS2="$IFS"; IFS="$DIFS"
  1348.                 eval `echo "$pwd" |\
  1349.                       sed -e 's:\([^/]*\)$:; dir="\1":' \
  1350.                           -e 's:^\(.*\)/[^/]*;:pwd="\1";:'\
  1351.                           -e 's:^;:pwd="";:'`
  1352.                 dstrevdir="$dir/$dstrevdir"
  1353.                 IFS="$OIFS2"
  1354.             else
  1355.                 dstrevdir="../$dstrevdir"
  1356.             fi
  1357.         done
  1358.         IFS="$OIFS"
  1359.     else
  1360.         src="`cd $src; pwd`";
  1361.     fi
  1362.  
  1363.     #   create directory tree at destination
  1364.     if [ ! -d $dst ]; then
  1365.         if [ ".$opt_t" = .yes ]; then
  1366.             echo "mkdir $dst" 1>&2
  1367.         fi
  1368.         mkdir $dst
  1369.     fi
  1370.     if [ ".$opt_a" = .yes ]; then
  1371.         DIRS=`cd $src; find . -type d -print |\
  1372.               sed -e '/^\.$/d' -e 's:^\./::'`
  1373.     else
  1374.         DIRS=`cd $src; find . -type d -print |\
  1375.               sed -e '/\/CVS/d' -e '/^\.$/d' -e 's:^\./::'`
  1376.     fi
  1377.     for dir in $DIRS; do
  1378.         if [ ".$opt_t" = .yes ]; then
  1379.             echo "mkdir $dst/$dir" 1>&2
  1380.         fi
  1381.         mkdir $dst/$dir
  1382.     done
  1383.  
  1384.     #   fill directory tree with symlinks to files
  1385.     if [ ".$opt_a" = .yes ]; then
  1386.         FILES="`cd $src; find . -depth -print |\
  1387.                 sed -e 's/^\.\///'`"
  1388.     else
  1389.         FILES="`cd $src; find . -depth -print |\
  1390.                 sed -e '/\.o$/d' -e '/\.a$/d' -e '/\.so$/d' \
  1391.                     -e '/\.cvsignore$/d' -e '/\/CVS/d' \
  1392.                     -e '/\/\.#/d' -e '/\.orig$/d' \
  1393.                     -e 's/^\.\///'`"
  1394.     fi
  1395.     for file in $FILES; do
  1396.          #  don't use `-type f' above for find because of symlinks
  1397.          if [ -d "$src/$file" ]; then
  1398.              continue
  1399.          fi
  1400.          basename=`echo $file | sed -e 's:^.*/::'`
  1401.          dir=`echo $file | sed -e 's:[^/]*$::' -e 's:/$::' -e 's:$:/:' -e 's:^/$::'`
  1402.          from=`echo "$src/$file" | sed -e 's/^\.\///'`
  1403.          to="$dst/$dir$basename"
  1404.          if [ $oneisabs = 0 ]; then
  1405.              if [ ".$dir" != . ]; then
  1406.                  subdir=`echo $dir | sed -e 's:/$::'`
  1407.                  #   derive reverse path from forward path
  1408.                  revdir=''
  1409.                  OIFS="$IFS"; IFS='/'
  1410.                  for pe in $subdir; do
  1411.                      revdir="../$revdir"
  1412.                  done
  1413.                  IFS="$OIFS"
  1414.                  #   finalize from
  1415.                  from="$revdir$from"
  1416.              fi
  1417.              from="$dstrevdir$from"
  1418.          fi
  1419.          if [ ".$opt_v" = .yes ]; then
  1420.              echo "    $to" 1>&2
  1421.          fi
  1422.          if [ ".$opt_t" = .yes ]; then
  1423.              echo "ln -s $from $to" 1>&2
  1424.          fi
  1425.          ln -s $from $to
  1426.     done
  1427.     ;;
  1428.  
  1429. fixperm )
  1430.     ##
  1431.     ##  fixperm -- Fix file permissions inside a source tree
  1432.     ##  Copyright (c) 1996-2000 Ralf S. Engelschall <rse@engelschall.com>
  1433.     ##  Originally written for ePerl
  1434.     ##
  1435.  
  1436.     paths="$*"
  1437.  
  1438.     #   check whether the test command supports the -x option
  1439.     cat >$tmpfile <<EOT
  1440. if [ -x / ] || [ -x /bin ] || [ -x /bin/ls ]; then
  1441.     exit 0
  1442. fi
  1443. exit 1
  1444. EOT
  1445.     if sh $tmpfile 2>/dev/null; then
  1446.         minusx="-x"
  1447.     else
  1448.         minusx="-r"
  1449.     fi
  1450.     rm -f $tmpfile
  1451.  
  1452.     #   iterate over paths
  1453.     for p in $paths; do
  1454.         for file in `find $p -depth -print`; do
  1455.             if [ -f $file ]; then
  1456.                 if [ $minusx $file ]; then
  1457.                     if [ ".$opt_v" = .yes ]; then
  1458.                         echo "-rwxrwxr-x $file" 2>&1
  1459.                     fi
  1460.                     if [ ".$opt_t" = .yes ]; then
  1461.                         echo "chmod 775 $file" 2>&1
  1462.                     fi
  1463.                     chmod 775 $file
  1464.                 else
  1465.                     if [ ".$opt_v" = .yes ]; then
  1466.                         echo "-rw-rw-r-- $file" 2>&1
  1467.                     fi
  1468.                     if [ ".$opt_t" = .yes ]; then
  1469.                         echo "chmod 664 $file" 2>&1
  1470.                     fi
  1471.                     chmod 664 $file
  1472.                 fi
  1473.                 continue
  1474.             fi
  1475.             if [ -d $file ]; then
  1476.                 if [ ".$opt_v" = .yes ]; then
  1477.                     echo "drwxrwxr-x $file" 2>&1
  1478.                 fi
  1479.                 if [ ".$opt_t" = .yes ]; then
  1480.                     echo "chmod 775 $file" 2>&1
  1481.                 fi
  1482.                 chmod 775 $file
  1483.                 continue
  1484.             fi
  1485.             if [ ".$opt_v" = .yes ]; then
  1486.                 echo "?????????? $file" 2>&1
  1487.             fi
  1488.         done
  1489.     done
  1490.     ;;
  1491.  
  1492. tarball )
  1493.     ##
  1494.     ##  tarball -- Roll distribution tarballs
  1495.     ##  Copyright (c) 1999-2000 Ralf S. Engelschall <rse@engelschall.com>
  1496.     ##  Originally written for shtool
  1497.     ##
  1498.  
  1499.     srcs="$*"
  1500.  
  1501.     #   check whether the test command supports the -x option
  1502.     cat >$tmpfile <<EOT
  1503. if [ -x / ] || [ -x /bin ] || [ -x /bin/ls ]; then
  1504.     exit 0
  1505. fi
  1506. exit 1
  1507. EOT
  1508.     if sh $tmpfile 2>/dev/null; then
  1509.         minusx="-x"
  1510.     else
  1511.         minusx="-r"
  1512.     fi
  1513.     rm -f $tmpfile
  1514.  
  1515.     #   find the tools
  1516.     paths="`echo $PATH |\
  1517.             sed -e 's%/*:%:%g' -e 's%/*$%%' \
  1518.                 -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \
  1519.                 -e 's/:/ /g'`"
  1520.     for spec in find:gfind,find tar:gtar,tar tardy:tardy,tarcust; do
  1521.         prg=`echo $spec | sed -e 's/:.*$//'`
  1522.         tools=`echo $spec | sed -e 's/^.*://'`
  1523.         eval "prg_${prg}=''"
  1524.         #   iterate over tools
  1525.         for tool in `echo $tools | sed -e 's/,/ /g'`; do
  1526.             #   iterate over paths
  1527.             for path in $paths; do
  1528.                 if [ $minusx "$path/$tool" ] && [ ! -d "$path/$tool" ]; then
  1529.                     eval "prg_${prg}=\"$path/$tool\""
  1530.                     break
  1531.                 fi
  1532.             done
  1533.             eval "val=\$prg_${prg}"
  1534.             if [ ".$val" != . ]; then
  1535.                 break
  1536.             fi
  1537.         done
  1538.     done
  1539.  
  1540.     #   expand source paths
  1541.     exclude=''
  1542.     for pat in `echo $opt_e | sed 's/,/ /g'`; do
  1543.         exclude="$exclude | grep -v '$pat'"
  1544.     done
  1545.     if [ ".$opt_t" = .yes ]; then
  1546.         echo "cp /dev/null $tmpfile.lst" 1>&2
  1547.     fi
  1548.     cp /dev/null $tmpfile.lst
  1549.     for src in $srcs; do
  1550.         if [ -d $src ]; then
  1551.             if [ ".$opt_t" = .yes ]; then
  1552.                 echo "(cd $src && $prg_find . -type f -depth -print) | sed -e 's:^\\.\$::' -e 's:^\\./::' | cat $exclude >>$tmpfile.lst" 1>&2
  1553.             fi
  1554.             (cd $src && find . -type f -depth -print) |\
  1555.             sed -e 's:^\.$::' -e 's:^\./::' | eval cat $exclude >>$tmpfile.lst
  1556.         else
  1557.             if [ ".$opt_t" = .yes ]; then
  1558.                 echo "echo $src >>$tmpfile.lst" 1>&2
  1559.             fi
  1560.             echo $src >>$tmpfile.lst
  1561.         fi
  1562.     done
  1563.     sort <$tmpfile.lst >$tmpfile.lst.n
  1564.     mv $tmpfile.lst.n $tmpfile.lst
  1565.     if [ ".$opt_v" = .yes ]; then
  1566.         cat $tmpfile.lst | sed -e 's/^/  /' 1>&2
  1567.     fi
  1568.  
  1569.     #   determine tarball file and directory name
  1570.     if [ ".$opt_o" != . ]; then
  1571.         tarfile="$opt_o"
  1572.         if [ ".$opt_d" != . ]; then
  1573.             tarname="$opt_d"
  1574.         else
  1575.             tarname=`echo $tarfile | sed -e 's/\.tar.*$//' -e 's;.*/\([^/]*\)$;\1;'`
  1576.         fi
  1577.     else
  1578.         if [ ".$opt_d" != . ]; then
  1579.             tarname="$opt_d"
  1580.         elif [ -d "$from" ]; then
  1581.             tarname=`echo $from | sed -e 's;.*/\([^/]*\)$;\1;'`
  1582.         else
  1583.             tarname="out"
  1584.         fi
  1585.         tarfile="$tarname.tar"
  1586.     fi
  1587.  
  1588.     #   roll the tarball
  1589.     compress=''
  1590.     if [ ".$opt_c" != . ]; then
  1591.         compress="| $opt_c"
  1592.     fi
  1593.     if [ ".$prg_tardy" != . ]; then
  1594.         #   the elegant hackers way
  1595.         tardy_opt="--prefix=$tarname"
  1596.         tardy_opt="$tardy_opt --user_number=0 --group_number=0" # security!
  1597.         if [ ".$opt_u" != . ]; then
  1598.             tardy_opt="$tardy_opt --user_name=$opt_u"
  1599.         fi
  1600.         if [ ".$opt_g" != . ]; then
  1601.             tardy_opt="$tardy_opt --group_name=$opt_g"
  1602.         fi
  1603.         if [ ".$opt_t" = .yes ]; then
  1604.             echo "cat $tmpfile.lst | xargs $prg_tar cf - | $prg_tardy $tardy_opt | cat $compress >$tmpfile.out" 1>&2
  1605.         fi
  1606.         cat $tmpfile.lst |\
  1607.         xargs $prg_tar cf - |\
  1608.         $prg_tardy $tardy_opt |\
  1609.         eval cat $compress >$tmpfile.out
  1610.         if [ ".$opt_t" = .yes ]; then
  1611.             echo "cp $tmpfile.out $tarfile" 1>&2
  1612.         fi
  1613.         cp $tmpfile.out $tarfile
  1614.     else
  1615.         #  the portable standard way
  1616.         if [ ".$opt_t" = .yes ]; then
  1617.             echo "mkdir $tmpdir/$tarname" 1>&2
  1618.         fi
  1619.         mkdir $tmpdir/$tarname || exit 1
  1620.         if [ ".$opt_t" = .yes ]; then
  1621.             echo "cat $tmpfile.lst | xargs $prg_tar cf - | (cd $tmpdir/$tarname && $prg_tar xf -)" 1>&2
  1622.         fi
  1623.         cat $tmpfile.lst |\
  1624.         xargs $prg_tar cf - |\
  1625.         (cd $tmpdir/$tarname && $prg_tar xf -)
  1626.         if [ ".$opt_u" != . ]; then
  1627.             if [ ".$opt_t" = .yes ]; then
  1628.                 echo "chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1" 2>&1
  1629.             fi
  1630.             chown -R $opt_u $tmpdir/$tarname >/dev/null 2>&1 ||\
  1631.             echo "$msgprefix:Warning: cannot set user name \`$opt_u' (need root priviledges)"
  1632.         fi
  1633.         if [ ".$opt_g" != . ]; then
  1634.             if [ ".$opt_t" = .yes ]; then
  1635.                 echo "chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1" 2>&1
  1636.             fi
  1637.             chgrp -R $opt_g $tmpdir/$tarname >/dev/null 2>&1 ||\
  1638.             echo "$msgprefix:Warning: cannot set group name \`$opt_g' (need root priviledges)"
  1639.         fi
  1640.         if [ ".$opt_t" = .yes ]; then
  1641.             echo "(cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) | cat $compress >$tmpfile.out" 1>&2
  1642.         fi
  1643.         (cd $tmpdir && $prg_find $tarname -type f -depth -print | sort | xargs $prg_tar cf -) |\
  1644.         eval cat $compress >$tmpfile.out
  1645.         if [ ".$opt_t" = .yes ]; then
  1646.             echo "cp $tmpfile.out $tarfile" 1>&2
  1647.         fi
  1648.         cp $tmpfile.out $tarfile
  1649.         if [ ".$opt_t" = .yes ]; then
  1650.             echo "rm -rf $tmpdir/$tarname" 1>&2
  1651.         fi
  1652.         rm -rf $tmpdir/$tarname
  1653.     fi
  1654.  
  1655.     #   cleanup
  1656.     if [ ".$opt_t" = .yes ]; then
  1657.         echo "rm -f $tmpfile.lst $tmpfile.out" 1>&2
  1658.     fi
  1659.     rm -f $tmpfile.lst $tmpfile.out
  1660.     ;;
  1661.  
  1662. guessos )
  1663.     ##
  1664.     ##  guessos -- Simple OS/platform guesser
  1665.     ##  Copyright (c) 1996-1999 The Apache Group, http://www.apache.org/
  1666.     ##  The Apache license applies (see http://www.apache.org/docs/LICENSE)
  1667.     ##  Originally written for Apache
  1668.     ##
  1669.  
  1670.     MACHINE=`(uname -m) 2>/dev/null` || MACHINE="unknown"
  1671.     RELEASE=`(uname -r) 2>/dev/null` || RELEASE="unknown"
  1672.      SYSTEM=`(uname -s) 2>/dev/null` ||  SYSTEM="unknown"
  1673.     VERSION=`(uname -v) 2>/dev/null` || VERSION="unknown"
  1674.  
  1675.     XREL=`(uname -X) 2>/dev/null | grep "^Release" | awk '{print $3}'`
  1676.     if [ "x$XREL" != "x" ]; then
  1677.         if [ -f /etc/kconfig ]; then
  1678.             case "$XREL" in
  1679.                 4.0|4.1) echo "${MACHINE}-whatever-isc4"; exit 0 ;;
  1680.             esac
  1681.         else
  1682.         case "$XREL" in
  1683.             3.2v4.2)
  1684.                 echo "whatever-whatever-sco3"; exit 0
  1685.                 ;;
  1686.             3.2v5.0*)
  1687.                 echo "whatever-whatever-sco5"; exit 0
  1688.                 ;;
  1689.             4.2MP)
  1690.                 if [ "x$VERSION" = "x2.1.1" ]; then
  1691.                     echo "${MACHINE}-whatever-unixware211"; exit 0
  1692.                 elif [ "x$VERSION" = "x2.1.2" ]; then
  1693.                     echo "${MACHINE}-whatever-unixware212"; exit 0
  1694.                 else
  1695.                     echo "${MACHINE}-whatever-unixware2"; exit 0
  1696.                 fi
  1697.                 ;;
  1698.             4.2)
  1699.                 echo "whatever-whatever-unixware1"; exit 0
  1700.                 ;;
  1701.             5)
  1702.                 case "$VERSION" in
  1703.                     7*) echo "${MACHINE}-whatever-unixware7"; exit 0 ;;
  1704.                 esac
  1705.                 ;;
  1706.         esac
  1707.         fi
  1708.     fi
  1709.     case "${SYSTEM}:${RELEASE}:${VERSION}:${MACHINE}" in
  1710.         MiNT:*)
  1711.             echo "m68k-atari-mint"; exit 0
  1712.             ;;
  1713.         A/UX:*)
  1714.             echo "m68k-apple-aux3"; exit 0
  1715.             ;;
  1716.         AIX:*)
  1717.             MACH=`echo $MACHINE | sed -e 's;[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F];;'`
  1718.             echo "${MACH}-ibm-aix${VERSION}.${RELEASE}"; exit 0
  1719.             ;;
  1720.         dgux:*)
  1721.             echo "${MACHINE}-dg-dgux"; exit 0
  1722.             ;;
  1723.         HI-UX:*)
  1724.             echo "${MACHINE}-hi-hiux"; exit 0
  1725.             ;;
  1726.         HP-UX:*)
  1727.             HPUXVER=`echo ${RELEASE}|sed -e 's/[^.]*.[0B]*//'`
  1728.             echo "${MACHINE}-hp-hpux${HPUXVER}"; exit 0
  1729.             ;;
  1730.         IRIX:*)
  1731.             if [ -f /usr/lib32/mips4/libm.so ]; then
  1732.                 echo "${MACHINE}/32-sgi-irix${RELEASE}"; exit 0
  1733.             else
  1734.                 echo "${MACHINE}-sgi-irix${RELEASE}"; exit 0
  1735.             fi
  1736.             ;;
  1737.         IRIX64:*)
  1738.             echo "${MACHINE}/64-sgi-irix${RELEASE}"; exit 0
  1739.             ;;
  1740.         Linux:*)
  1741.             V='whatever'
  1742.             case "$MACHINE" in
  1743.                 i?86) V='pc' ;;
  1744.             esac
  1745.             R=''
  1746.             case "$RELEASE" in
  1747.                 [1-9].*) R=`echo $RELEASE | cut -c1` ;;
  1748.             esac
  1749.             echo "${MACHINE}-${V}-linux-gnu${R}"; exit 0
  1750.             ;;
  1751.         LynxOS:*)
  1752.             echo "${MACHINE}-lynx-lynxos"; exit 0
  1753.             ;;
  1754.         BSD/386|BSD/OS:3.*)
  1755.             echo "${MACHINE}-whatever-bsdi3"; exit 0
  1756.             ;;
  1757.         BSD/386:*:*:*486*|BSD/OS:*:*:*:*486*)
  1758.             echo "i486-whatever-bsdi"; exit 0
  1759.             ;;
  1760.         BSD/386:*|BSD/OS:*)
  1761.             echo "${MACHINE}-whatever-bsdi"; exit 0
  1762.             ;;
  1763.         FreeBSD:*)
  1764.             VERS=`echo ${RELEASE} | sed -e 's/[-(].*//'`
  1765.             MACH=`/sbin/sysctl -n hw.model`
  1766.             ARCH='whatever'
  1767.             case ${MACH} in
  1768.                *386*       ) MACH="i386"     ;;
  1769.                *486*       ) MACH="i486"     ;;
  1770.                Pentium\ II*) MACH="i686"     ;;
  1771.                Pentium*    ) MACH="i586"     ;;
  1772.                Alpha*      ) MACH="alpha"    ;;
  1773.                *           ) MACH="$MACHINE" ;;
  1774.             esac
  1775.             case ${MACH} in
  1776.                i[0-9]86 ) ARCH="pc" ;;
  1777.             esac
  1778.             echo "${MACH}-${ARCH}-freebsd${VERS}"; exit 0
  1779.             ;;
  1780.         NetBSD:*:*:*486*)
  1781.             echo "i486-whatever-netbsd${RELEASE}"; exit 0
  1782.             ;;
  1783.         NetBSD:*)
  1784.             echo "${MACHINE}-whatever-netbsd${RELEASE}"; exit 0
  1785.             ;;
  1786.         OpenBSD:*)
  1787.             echo "${MACHINE}-whatever-openbsd"; exit 0
  1788.             ;;
  1789.         OSF1:*:*:*alpha*)
  1790.             VERS=`echo $RELEASE | sed -e 's;^V;;'`
  1791.             echo "${MACHINE}-dec-osf${VERS}"; exit 0
  1792.             ;;
  1793.         QNX:*)
  1794.             if [ "$VERSION" -gt 422 ]; then
  1795.                 echo "${MACHINE}-qssl-qnx32"
  1796.             else
  1797.                 echo "${MACHINE}-qssl-qnx"
  1798.             fi
  1799.             exit 0
  1800.             ;;
  1801.         Paragon*:*:*:*)
  1802.             echo "i860-intel-osf1"; exit 0
  1803.             ;;
  1804.         SunOS:5.*)
  1805.             VERSION=`echo $RELEASE | sed -e 's;^5\.;;'`
  1806.             echo "${MACHINE}-sun-solaris2.${VERSION}"; exit 0
  1807.             ;;
  1808.         SunOS:*)
  1809.             echo "${MACHINE}-sun-sunos4"; exit 0
  1810.             ;;
  1811.         UNIX_System_V:4.*:*)
  1812.             echo "${MACHINE}-whatever-sysv4"; exit 0
  1813.             ;;
  1814.         unix:3.0.9*:*:88k)
  1815.             echo "${MACHINE}-encore-sysv4"; exit 0
  1816.             ;;
  1817.         *:4*:R4*:m88k)
  1818.             echo "${MACHINE}-whatever-sysv4"; exit 0
  1819.             ;;
  1820.         UnixWare:5:99*:*)
  1821.             # Gemini, beta release of next rev of unixware
  1822.             echo "${MACHINE}-whatever-unixware212"; exit 0
  1823.             ;;
  1824.         DYNIX/ptx:4*:*)
  1825.             echo "${MACHINE}-whatever-sysv4"; exit 0
  1826.             ;;
  1827.         *:4.0:3.0:[345][0-9]?? | *:4.0:3.0:3[34]??[/,]* | library:*)
  1828.             echo "x86-ncr-sysv4"; exit 0
  1829.             ;;
  1830.         ULTRIX:*)
  1831.             echo "${MACHINE}-unknown-ultrix"; exit 0
  1832.             ;;
  1833.         SINIX-?:* | ReliantUNIX-?:*)
  1834.             echo "${MACHINE}-siemens-sysv4"; exit 0
  1835.             ;;
  1836.         POSIX*BS2000)
  1837.             echo "${MACHINE}-siemens-sysv4"; exit 0
  1838.             ;;
  1839.         machten:*)
  1840.            echo "${MACHINE}-tenon-${SYSTEM}"; exit 0;
  1841.            ;;
  1842.         ConvexOS:*:11.*:*)
  1843.            echo "${MACHINE}-v11-${SYSTEM}"; exit 0;
  1844.            ;;
  1845.         UNIX_SV:*:*:maxion)
  1846.            echo "${MACHINE}-ccur-sysv4"; exit 0;
  1847.            ;;
  1848.         PowerMAX_OS:*:*:Night_Hawk)
  1849.            MACHINE=`uname -p`
  1850.            echo "${MACHINE}-concurrent-powermax"; exit 0;
  1851.            ;;
  1852.         UNIX_SV:*)
  1853.            if [ -d /usr/nec ];then
  1854.                echo "mips-nec-sysv4"; exit 0;
  1855.            fi
  1856.            ;;
  1857.         NonStop-UX:4.[02]*:[BC]*:*)
  1858.            echo "${MACHINE}-tandem-sysv4"; exit 0;
  1859.            ;;
  1860.         Rhapsody:*:*:*)
  1861.            case "${MACHINE}" in
  1862.                "Power Macintosh") MACHINE=powerpc ;;
  1863.            esac
  1864.            echo "${MACHINE}-apple-rhapsody${RELEASE}"; exit 0
  1865.            ;;
  1866.         "Mac OS":*:*:*)
  1867.            MACHINE=`uname -p`
  1868.            echo "${MACHINE}-apple-macos${RELEASE}"; exit 0
  1869.            ;;
  1870.         "RISC iX":*)
  1871.            echo "arm-whatever-riscix"; exit 0;
  1872.            ;;
  1873.         *:4.0:2:*)
  1874.            echo "whatever-unisys-sysv4"; exit 0;
  1875.            ;;
  1876.         *:*:dcosx:NILE*)
  1877.            echo "pyramid-pyramid-svr4"; exit 0;
  1878.            ;;
  1879.         *:*:*:"DRS 6000")
  1880.            echo "drs6000-whatever-whatever"; exit 0;
  1881.            ;;
  1882.         AmigaOS:*:*:* )
  1883.            echo "${MACHINE}-whatever-${SYSTEM}${RELEASE}"; exit 0
  1884.            ;;
  1885.     esac
  1886.  
  1887.     # Now NeXT
  1888.     ISNEXT=`(hostinfo) 2>/dev/null`
  1889.     case "$ISNEXT" in
  1890.         *NeXT*)
  1891.              # Swiped from a friendly uname clone for NEXT/OPEN Step.
  1892.              NEXTOSVER="`hostinfo | sed -n 's/.*NeXT Mach \([0-9\.]*\).*/\1/p'`"
  1893.              if [ "$NEXTOSVER" -gt 3.3 ]; then
  1894.                  NEXTOS="openstep"
  1895.              else
  1896.                  NEXTOS="nextstep"
  1897.              fi
  1898.              NEXTREL="`hostinfo | sed -n 's/.*NeXT Mach \([0-9\.]*\).*/\1/p'`"
  1899.              NEXTARCH=`arch`
  1900.              echo "${NEXTARCH}-next-${NEXTOS}${NEXTREL}" ; exit 0
  1901.              ;;
  1902.     esac
  1903.  
  1904.     # Fallback
  1905.     echo "${MACHINE}-whatever-${SYSTEM}/${RELEASE}/${VERSION}"
  1906.     ;;
  1907.  
  1908. arx )
  1909.     ##
  1910.     ##  arx -- Extended archive command
  1911.     ##  Copyright (c) 1999-2000 Ralf S. Engelschall <rse@engelschall.com>
  1912.     ##  Originally written for shtool
  1913.     ##
  1914.  
  1915.     ar_prg="$opt_C"
  1916.     ar_cmd="$1"; shift
  1917.     archive="$1"; shift
  1918.     files="$*"
  1919.  
  1920.     #   walk through the file list and expand archives members
  1921.     tmpdir=`echo $archive | sed -e 's;[^/]*$;.arx;'`
  1922.     nfiles=''
  1923.     if [ ".$files" != . ]; then
  1924.         for file in $files; do
  1925.             if [ ! -f $file ]; then
  1926.                 echo "$msgprefix:Error: input file not found: $file" 1>&2
  1927.                 exit 1
  1928.             fi
  1929.             case $file in
  1930.                 *.a )
  1931.                     if [ ! -d $tmpdir ]; then
  1932.                         if [ ".$opt_t" = .yes ]; then
  1933.                             echo "mkdir $tmpdir" 1>&2
  1934.                         fi
  1935.                         mkdir $tmpdir
  1936.                     fi
  1937.                     case $tmpdir in
  1938.                          .arx )
  1939.                              from="../$file"
  1940.                              ;;
  1941.                          * )
  1942.                              dir=`echo $file | sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;' -e 's;^$;.;'`
  1943.                              base=`echo $file | sed -e 's;.*/\([^/]*\)$;\1;'`
  1944.                              from="`cd $dir; pwd`/$base"
  1945.                              ;;
  1946.                     esac
  1947.                     if [ ".$opt_t" = .yes ]; then
  1948.                         echo "(cd $tmpdir && $ar_prg x $from)" 1>&2
  1949.                     fi
  1950.                     (cd $tmpdir && eval $ar_prg x $from)
  1951.                     if [ $? -ne 0 ]; then
  1952.                         echo "$msgprefix:Error: member extraction failed for archive: $file" 1>&2
  1953.                         exit 1
  1954.                     fi
  1955.                     for member in - `eval $ar_prg t $file | sed -e '/_\.SYMDEF/d'`; do
  1956.                         [ ".$member" = .- ] && continue
  1957.                         nfiles="$nfiles $tmpdir/$member"
  1958.                     done
  1959.                     ;;
  1960.                 * )
  1961.                     nfiles="$nfiles $file"
  1962.                     ;;
  1963.             esac
  1964.         done
  1965.     fi
  1966.  
  1967.     #   run the final archive command
  1968.     if [ ".$opt_t" = .yes ]; then
  1969.         echo "$ar_prg $ar_cmd $archive $nfiles" 1>&2
  1970.     fi
  1971.     eval $ar_prg $ar_cmd $archive $nfiles
  1972.     if [ $? -ne 0 ]; then
  1973.         echo "$msgprefix:Error: archive command failed" 1>&2
  1974.         exit $?
  1975.     fi
  1976.  
  1977.     #   cleanup and die gracefully
  1978.     if [ -d $tmpdir ]; then
  1979.         if [ ".$opt_t" = .yes ]; then
  1980.             echo "rm -rf $tmpdir" 1>&2
  1981.         fi
  1982.         rm -rf $tmpdir
  1983.     fi
  1984.     ;;
  1985.  
  1986. slo )
  1987.     ##
  1988.     ##  slo -- Separate linker options by library class
  1989.     ##  Copyright (c) 1998-2000 Ralf S. Engelschall <rse@engelschall.com>
  1990.     ##  Originally written for Apache
  1991.     ##
  1992.  
  1993.     DIFS="$IFS"
  1994.  
  1995.     #   parse out -L and -l options from command line
  1996.     DIRS=''
  1997.     LIBS=''
  1998.     ARGV=''
  1999.     optprev=''
  2000.     for opt
  2001.     do
  2002.         #   concatenate with previous option if exists
  2003.         if [ ".$optprev" != . ]; then
  2004.             opt="${optprev}${opt}";
  2005.             optprev=''
  2006.         fi
  2007.         #   remember options for arg when used stand-alone
  2008.         if [ ".$opt" = ".-L" -o ".$opt" = ".-l" ]; then
  2009.             optprev="$opt"
  2010.             continue;
  2011.         fi
  2012.         #   split argument into option plus option argument
  2013.         arg="`echo $opt | cut -c3-`"
  2014.         opt="`echo $opt | cut -c1-2`"
  2015.         #   store into containers
  2016.         case $opt in
  2017.             -L) DIRS="$DIRS:$arg" ;;
  2018.             -l) LIBS="$LIBS:$arg" ;;
  2019.              *) ARGV="$ARGV $opt" ;;
  2020.         esac
  2021.     done
  2022.  
  2023.     #   set linker default directories
  2024.     DIRS_DEFAULT='/lib:/usr/lib'
  2025.     if [ ".$LD_LIBRARY_PATH" != . ]; then
  2026.         DIRS_DEFAULT="$DIRS_DEFAULT:$LD_LIBRARY_PATH"
  2027.     fi
  2028.  
  2029.     #   sort options by class
  2030.     DIRS_OBJ=''
  2031.     LIBS_OBJ=''
  2032.     DIRS_PIC=''
  2033.     LIBS_PIC=''
  2034.     DIRS_DSO=''
  2035.     LIBS_DSO=''
  2036.  
  2037.     #    for each library...
  2038.     OIFS="$IFS" IFS=':'
  2039.     for lib in $LIBS; do
  2040.         [ ".$lib" = . ] && continue
  2041.  
  2042.         found='no'
  2043.         found_indefdir='no'
  2044.         found_type=''
  2045.         found_dir=''
  2046.  
  2047.         #    for each directory...
  2048.         OIFS2="$IFS" IFS=":$DIFS"
  2049.         for dir in ${DIRS} switch-to-defdirs ${DIRS_DEFAULT}; do
  2050.             [ ".$dir" = . ] && continue
  2051.             [ ".$dir" = .switch-to-defdirs ] && found_indefdir=yes
  2052.             [ ! -d $dir ] && continue
  2053.  
  2054.             #    search the file
  2055.             OIFS3="$IFS" IFS="$DIFS"
  2056.             for file in '' `cd $dir && ls lib${lib}.* 2>/dev/null`; do
  2057.                  [ ".$file" = . ] && continue
  2058.                  case $file in
  2059.                      *.so|*.so.[0-9]*|*.sl|*.sl.[0-9]* )
  2060.                           found=yes;
  2061.                           found_type=DSO;
  2062.                           break
  2063.                           ;;
  2064.                      *.lo|*.la )
  2065.                           found=yes;
  2066.                           found_type=PIC
  2067.                           ;;
  2068.                      *.a )
  2069.                           if [ ".$found_type" = . ]; then
  2070.                               found=yes
  2071.                               found_type=OBJ
  2072.                           fi
  2073.                           ;;
  2074.                  esac
  2075.             done
  2076.             IFS="$OIFS3"
  2077.             if [ ".$found" = .yes ]; then
  2078.                 found_dir="$dir"
  2079.                 break
  2080.             fi
  2081.         done
  2082.         IFS="$OIFS2"
  2083.  
  2084.         if [ ".$found" = .yes ]; then
  2085.             if [ ".$found_indefdir" != .yes ]; then
  2086.                 eval "dirlist=\"\${DIRS_${found_type}}:\""
  2087.                 if [ ".`echo \"$dirlist\" | fgrep :$found_dir:`" = . ]; then
  2088.                     eval "DIRS_${found_type}=\"\$DIRS_${found_type}:${found_dir}\""
  2089.                 fi
  2090.                 eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\""
  2091.             else
  2092.                 eval "LIBS_${found_type}=\"\$LIBS_${found_type}:$lib\""
  2093.             fi
  2094.         else
  2095.             LIBS_OBJ="$LIBS_OBJ:$lib"
  2096.             #dirlist="`echo $DIRS $DIRS_DEFAULT | sed -e 's/:/ /g'`"
  2097.             #echo "slo:Warning: library \"$lib\" not found in any of the following dirs:" 2>&1
  2098.             #echo "slo:Warning: $dirlist" 1>&1
  2099.         fi
  2100.     done
  2101.     IFS="$OIFS"
  2102.  
  2103.     #   also pass-through unused dirs even if it's useless
  2104.     OIFS="$IFS" IFS=':'
  2105.     for dir in $DIRS; do
  2106.         dirlist="${DIRS_OBJ}:${DIRS_PIC}:${DIRS_DSO}:"
  2107.         if [ ".`echo \"$dirlist\" | fgrep :$dir:`" = . ]; then
  2108.             DIRS_OBJ="$DIRS_OBJ:$dir"
  2109.         fi
  2110.     done
  2111.     IFS="$OIFS"
  2112.  
  2113.     #   reassemble the options but separated by type
  2114.     for type in OBJ PIC DSO; do
  2115.         OIFS="$IFS" IFS=':'
  2116.         eval "libs=\"\$LIBS_${type}\""
  2117.         opts=''
  2118.         for lib in $libs; do
  2119.             [ ".$lib" = . ] && continue
  2120.             opts="$opts -l$lib"
  2121.         done
  2122.         eval "LIBS_${type}=\"$opts\""
  2123.  
  2124.         eval "dirs=\"\$DIRS_${type}\""
  2125.         opts=''
  2126.         for dir in $dirs; do
  2127.             [ ".$dir" = . ] && continue
  2128.             opts="$opts -L$dir"
  2129.         done
  2130.         eval "DIRS_${type}=\"$opts\""
  2131.         IFS="$OIFS"
  2132.     done
  2133.  
  2134.     #   give back results
  2135.     for var in ARGV DIRS_OBJ LIBS_OBJ DIRS_PIC LIBS_PIC DIRS_DSO LIBS_DSO; do
  2136.         eval "val=\"\$${var}\""
  2137.         val="`echo $val | sed -e 's/^ *//'`"
  2138.         echo "SLO_${var}=\"${val}\""
  2139.     done
  2140.     ;;
  2141.  
  2142. scpp )
  2143.     ##
  2144.     ##  scpp -- Sharing C Pre-Processor
  2145.     ##  Copyright (c) 1999-2000 Ralf S. Engelschall <rse@engelschall.com>
  2146.     ##  Originally written for GNU Pth
  2147.     ##
  2148.  
  2149.     srcs="$*"
  2150.     output="${opt_o}.n"
  2151.  
  2152.     #   find a reasonable Awk
  2153.     awk=''
  2154.     paths=`echo $PATH |\
  2155.            sed -e 's%/*:%:%g' -e 's%/$%%' \
  2156.                -e 's/^:/.:/' -e 's/::/:.:/g' -e 's/:$/:./' \
  2157.                -e 's/:/ /g'`
  2158.     for name in gawk nawk awk; do
  2159.         for path in $paths; do
  2160.             if [ -r "$path/$name" ]; then
  2161.                 awk="$path/$name"
  2162.                 break
  2163.             fi
  2164.         done
  2165.         if [ ".$awk" != . ]; then
  2166.             break
  2167.         fi
  2168.     done
  2169.     if [ ".$awk" = . ]; then
  2170.         echo "$msgprefix:Error: cannot find a reasonable Awk" 1>&2
  2171.         exit 1
  2172.     fi
  2173.  
  2174.     #   parse source file(s)
  2175.     if [ ".$opt_v" = .yes ]; then
  2176.         echo "Parsing:" | $awk '{ printf("%s", $0); }' 1>&2
  2177.     fi
  2178.     for src in $srcs; do
  2179.         if [ ".$opt_v" = .yes ]; then
  2180.             echo $src | $awk '{ printf(" %s", $0); }' 1>&2
  2181.         fi
  2182.         $awk <$src '
  2183.            BEGIN {
  2184.                ln    = 0;
  2185.                fln   = 0;
  2186.                level = 0;
  2187.                mode  = "";
  2188.                store = "";
  2189.            }
  2190.            {
  2191.                ln++;
  2192.            }
  2193.            /^#if.*/ {
  2194.                level++;
  2195.            }
  2196.            /^#if [a-zA-Z_][a-zA-Z0-9_]* *$/ {
  2197.                if ($2 == define) {
  2198.                    mode = "D";
  2199.                    printf("D:#line %d \"%s\"\n", ln, src);
  2200.                    next;
  2201.                }
  2202.            }
  2203.            /^#endif.*/ {
  2204.                level--;
  2205.                if (mode == "D" && level == 0) {
  2206.                    mode = "";
  2207.                    next;
  2208.                }
  2209.            }
  2210.            /^[a-zA-Z_][a-zA-Z0-9_].*;.*/ {
  2211.                if ($1 == class) {
  2212.                    printf("V:#line %d \"%s\"\n", ln, src);
  2213.                    printf("V:%s\n", $0);
  2214.                    printf("J:%s\n", $0);
  2215.                    next;
  2216.                }
  2217.            }
  2218.            /^[a-zA-Z_][a-zA-Z0-9_].*=.*/ {
  2219.                if ($1 == class) {
  2220.                    printf("V:#line %d \"%s\"\n", ln, src);
  2221.                    printf("V:%s\n", $0);
  2222.                    printf("J:%s\n", $0);
  2223.                    next;
  2224.                }
  2225.            }
  2226.            /^[a-zA-Z_][a-zA-Z0-9_]*/ {
  2227.                if ($1 == class) {
  2228.                    fln = ln;
  2229.                    store = $0;
  2230.                    mode = "F";
  2231.                    next;
  2232.                }
  2233.            }
  2234.            /^\{ *$/ {
  2235.                if (mode == "F") {
  2236.                    printf("F:#line %d \"%s\"\n", fln, src);
  2237.                    printf("F:%s;\n", store);
  2238.                    printf("I:%s;\n", store);
  2239.                    store = "";
  2240.                    mode = "";
  2241.                    next;
  2242.                }
  2243.            }
  2244.            {
  2245.                if (mode == "D")
  2246.                    printf("D:%s\n", $0);
  2247.                else if (mode == "F")
  2248.                    store = store " " $0;
  2249.            }
  2250.         ' "src=$src" "define=$opt_D" "class=$opt_C" >>$tmpfile
  2251.     done
  2252.     if [ ".$opt_v" = .yes ]; then
  2253.         echo "" 1>&2
  2254.     fi
  2255.  
  2256.     #   start generating output header
  2257.     echo "/* $opt_o -- autogenerated from $opt_t, DO NOT EDIT! */" >$output
  2258.     echo "#line 1 \"$opt_t\"" >>$output
  2259.     sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd' |\
  2260.     sed -e "/^${opt_M} *\$/d" >>$output
  2261.  
  2262.     #   merge in the define blocks
  2263.     grep '^D:' $tmpfile | sed -e 's/^D://' >>$output
  2264.  
  2265.     #   generate standard prolog
  2266.     echo "#line 1 \"_ON_THE_FLY_\"" >>$output
  2267.     echo "" >>$output
  2268.     echo "/* make sure the scpp source extensions are skipped */" >>$output
  2269.     echo "#define $opt_D 0" >>$output
  2270.     echo "#define $opt_C /**/" >>$output
  2271.  
  2272.     #   generate namespace hiding for variables
  2273.     echo "" >>$output
  2274.     echo "/* move intern variables to hidden namespace */" >>$output
  2275.     grep '^J:' $tmpfile | sed >>$output \
  2276.         -e 's/^J://' \
  2277.         -e 's/  */ /g' \
  2278.         -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\];.*$/#define \1 __\1/' \
  2279.         -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\)\[\] =.*$/#define \1 __\1/' \
  2280.         -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\);.*$/#define \1 __\1/' \
  2281.         -e 's/^[^=;]*[ *]\([a-zA-Z0-9_]*\) =.*$/#define \1 __\1/'
  2282.  
  2283.     #   generate namespace hiding for functions
  2284.     echo "" >>$output
  2285.     echo "/* move intern functions to hidden namespace */" >>$output
  2286.     grep '^I:' $tmpfile | sed >>$output \
  2287.         -e 's/^I://' \
  2288.         -e 's/\([ (]\) */\1/g' \
  2289.         -e 's/ *\([),]\)/\1/g' \
  2290.         -e 's/^[^(]*[ *]\([a-zA-Z0-9_]*\)(.*$/#define \1 __\1/'
  2291.  
  2292.     #   generate prototypes for variables
  2293.     echo "" >>$output
  2294.     echo "/* prototypes for intern variables */" >>$output
  2295.     grep '^V:' $tmpfile | sed >>$output \
  2296.         -e 's/^V://' \
  2297.         -e 's/  */ /g' \
  2298.         -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\);.*$/\1;/' \
  2299.         -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\[\]\) =.*$/\1;/' \
  2300.         -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\);.*$/\1;/' \
  2301.         -e 's/^\([^=;]*[ *][a-zA-Z0-9_]*\) =.*$/\1;/' \
  2302.         -e 's/ ;/;/g' \
  2303.         -e "s/^$opt_C /extern /"
  2304.  
  2305.     #   generate prototypes for functions
  2306.     echo "" >>$output
  2307.     echo "/* prototypes for intern functions */" >>$output
  2308.     grep '^F:' $tmpfile | sed >>$output \
  2309.         -e 's/^F://' \
  2310.         -e 's/\([ (]\) */\1/g' \
  2311.         -e 's/ *\([),]\)/\1/g' \
  2312.         -e 's/\([* ]\)[a-zA-Z0-9_]*,/\1,/g' \
  2313.         -e 's/\([* ]\)[a-zA-Z0-9_]*);/\1);/g' \
  2314.         -e 's/(\*[a-zA-Z0-9_]*)(/(*)(/g' \
  2315.         -e 's/\([ (]\) */\1/g' \
  2316.         -e 's/ *\([),]\)/\1/g' \
  2317.         -e "s/^$opt_C /extern /"
  2318.  
  2319.     #   finish generating output header
  2320.     n=`(echo ''; sed <$opt_t -e "1,/^${opt_M} *\$/p" -e 'd') |\
  2321.        wc -l | sed -e 's;^ *\([0-9]*\) *$;\1;'`
  2322.     echo "#line $n \"$opt_t\"" >>$output
  2323.     sed <$opt_t -e "/^${opt_M} *\$/,\$p" -e 'd' |\
  2324.     sed -e "/^${opt_M} *\$/d" >>$output
  2325.  
  2326.     #   create final output file
  2327.     if [ -f $opt_o ]; then
  2328.         if [ ".$opt_p" = .yes ]; then
  2329.             grep -v '^#line' $opt_o  >$tmpfile.o
  2330.             grep -v '^#line' $output >$tmpfile.n
  2331.             out_old="$tmpfile.o"
  2332.             out_new="$tmpfile.n"
  2333.         else
  2334.             out_old="$opt_o"
  2335.             out_new="$output"
  2336.         fi
  2337.         if cmp -s $out_old $out_new; then
  2338.             :
  2339.         else
  2340.             cp $output $opt_o
  2341.         fi
  2342.     else
  2343.         cp $output $opt_o
  2344.     fi
  2345.     rm -f $output
  2346.     rm -f $tmpfile $tmpfile.* >/dev/null 2>&1
  2347.     ;;
  2348.  
  2349. version )
  2350.     ##
  2351.     ##  version -- Generate and maintain a version information file
  2352.     ##  Copyright (c) 1994-2000 Ralf S. Engelschall <rse@engelschall.com>
  2353.     ##  Originally written for ePerl
  2354.     ##
  2355.  
  2356.     LANGUAGE="$opt_l"
  2357.     NAME="$opt_n"
  2358.     PREFIX="$opt_p"
  2359.     FULLVERSION="$opt_s"
  2360.     INCREASE="$opt_i"
  2361.     REPORT="$opt_d"
  2362.     FILE="$1"
  2363.  
  2364.     #   determine language
  2365.     if [ ".$LANGUAGE" = .unknown ]; then
  2366.         case $FILE in
  2367.             *.txt )       LANGUAGE=txt  ;;
  2368.             *.c )         LANGUAGE=c    ;;
  2369.             *.pl | *.pm ) LANGUAGE=perl ;;
  2370.             * )           echo "$tool:Error: unknown language type" 1>&2; exit 1 ;;
  2371.         esac
  2372.     fi
  2373.  
  2374.     #   determine prefix from name and vice versa
  2375.     if [ ".$PREFIX" = . -o ".$PREFIX" = .unknown ]; then
  2376.         if [ ".$NAME" != . -a ".$NAME" != .unknown ]; then
  2377.             PREFIX="$NAME"
  2378.         fi
  2379.     fi
  2380.     if [ ".$NAME" = . -o ".$NAME" = .unknown ]; then
  2381.         if [ ".$PREFIX" != . -a ".$PREFIX" != .unknown ]; then
  2382.             NAME="$PREFIX"
  2383.         fi
  2384.     fi
  2385.  
  2386.     #   determine version
  2387.     date=unknown
  2388.     version=0
  2389.     revision=0
  2390.     bplevel=0
  2391.     if [ ".$FULLVERSION" = .unknown ]; then
  2392.         if [ -r "$FILE" ]; then
  2393.             #   grep out current information
  2394.             id=`grep 'Version [0-9]*.[0-9]*[.abps][0-9]* ([0-9]*-[a-zA-Z]*-[0-9]*)' $FILE | \
  2395.                 head -1 | \
  2396.                 sed -e 's%.*Version \([0-9]*\)\.\([0-9]*\)\([.abps]\)\([0-9]*\) (\([0-9]*-[a-zA-Z]*-[0-9]*\)).*%\1:\2:\3:\4:\5%'`
  2397.             version=`echo $id | awk -F: '{ print $1 }'`
  2398.             revision=`echo $id | awk -F: '{ print $2 }'`
  2399.             bptype=`echo $id | awk -F: '{ print $3 }'`
  2400.             bplevel=`echo $id | awk -F: '{ print $4 }'`
  2401.             date=`echo $id | awk -F: '{ print $5 }'`
  2402.             if [ .$REPORT = .NO ]; then
  2403.                 case $INCREASE in
  2404.                     b ) bplevel=`expr $bplevel + 1`
  2405.                         bptype=b
  2406.                         ;;
  2407.                     a ) bplevel=`expr $bplevel + 1`
  2408.                         bptype=a
  2409.                         ;;
  2410.                     s ) bplevel=`expr $bplevel + 1`
  2411.                         bptype=s
  2412.                         ;;
  2413.                     P ) bplevel=`expr $bplevel + 1`
  2414.                         bptype=.
  2415.                         ;;
  2416.                     p ) bplevel=`expr $bplevel + 1`
  2417.                         bptype=p
  2418.                         ;;
  2419.                     r ) revision=`expr $revision + 1`
  2420.                         bptype=.
  2421.                         bplevel=0
  2422.                         ;;
  2423.                     v ) version=`expr $version + 1`
  2424.                         revision=0
  2425.                         bptype=.
  2426.                         bplevel=0
  2427.                         ;;
  2428.                 esac
  2429.                 date=calc
  2430.             fi
  2431.             FULLVERSION="$version.$revision$bptype$bplevel"
  2432.         else
  2433.             #   intialise to first version
  2434.             version=0
  2435.             revision=5
  2436.             bptype=b
  2437.             bplevel=0
  2438.             date=calc
  2439.         fi
  2440.     else
  2441.         #   take given version
  2442.         V=`echo $FULLVERSION | sed -e 's%\([0-9]*\)\.\([0-9]*\)\([.abps]\)\([0-9]*\).*%\1:\2:\3:\4%'`
  2443.         version=`echo $V | awk -F: '{ print $1 }'`
  2444.         revision=`echo $V | awk -F: '{ print $2 }'`
  2445.         bptype=`echo $V | awk -F: '{ print $3 }'`
  2446.         bplevel=`echo $V | awk -F: '{ print $4 }'`
  2447.         date=calc
  2448.     fi
  2449.  
  2450.     #   determine hex value of version
  2451.     case $FULLVERSION in
  2452.         *.*a* )
  2453.             HEX=`echo "$FULLVERSION" | sed -e 's/a.*//' | awk -F. '{ printf("%d%02d", $1, $2); }' &&
  2454.                  echo "$FULLVERSION" | sed -e 's/.*a//' | awk '{ printf("0%02d", $1); }'`
  2455.             ;;
  2456.         *.*b* )
  2457.             HEX=`echo "$FULLVERSION" | sed -e 's/b.*//' | awk -F. '{ printf("%d%02d", $1, $2); }' &&
  2458.                  echo "$FULLVERSION" | sed -e 's/.*b//' | awk '{ printf("1%02d", $1); }'`
  2459.             ;;
  2460.         *.*.* )
  2461.             HEX=`echo "$FULLVERSION" | awk -F. '{ printf("%d%02d2%02d", $1, $2, $3); }'`
  2462.             ;;
  2463.     esac
  2464.  
  2465.     #   determine libtool version
  2466.     case $FULLVERSION in
  2467.         *.*a* )
  2468.             LTV=`echo "$FULLVERSION" | sed -e 's/a.*//' | awk -F. '{ printf("%d:0", $1*10+$2); }'`
  2469.             ;;
  2470.         *.*b* )
  2471.             LTV=`echo "$FULLVERSION" | sed -e 's/b.*//' | awk -F. '{ printf("%d:0", $1*10+$2); }'`
  2472.             ;;
  2473.         *.*.* )
  2474.             LTV=`echo "$FULLVERSION" | awk -F. '{ printf("%d:%d", $1*10+$2, $3); }'`
  2475.             ;;
  2476.     esac
  2477.  
  2478.     #   determine string out of filename
  2479.     #   (don't try to optimize this in any way - portability!)
  2480.     FILESTR=`echo "$FILE" |\
  2481.              tr 'abcdefghijklmnopqrstuvwxyz./%+' \
  2482.                 'ABCDEFGHIJKLMNOPQRSTUVWXYZ____' | sed -e 's/-/_/g'`
  2483.  
  2484.     #   determine date
  2485.     if [ ".$date" = .calc ]; then
  2486.         day=`date '+%d'`
  2487.         month=`date '+%m'`
  2488.         year=`date '+%Y' 2>/dev/null`
  2489.         if [ ".$time_year" = . ]; then
  2490.             year=`date '+%y'`
  2491.             case $year in
  2492.                 [5-9][0-9]) year="19$year" ;;
  2493.                 [0-4][0-9]) year="20$year" ;;
  2494.             esac
  2495.         fi
  2496.         case $month in
  2497.             1|01) month='Jan' ;;
  2498.             2|02) month='Feb' ;;
  2499.             3|03) month='Mar' ;;
  2500.             4|04) month='Apr' ;;
  2501.             5|05) month='May' ;;
  2502.             6|06) month='Jun' ;;
  2503.             7|07) month='Jul' ;;
  2504.             8|08) month='Aug' ;;
  2505.             9|09) month='Sep' ;;
  2506.               10) month='Oct' ;;
  2507.               11) month='Nov' ;;
  2508.               12) month='Dec' ;;
  2509.         esac
  2510.         date="${day}-${month}-${year}"
  2511.     fi
  2512.  
  2513.     if [ .$REPORT != .NO ]; then
  2514.         case $REPORT in
  2515.             long )
  2516.                 echo "$version.$revision$bptype$bplevel ($date)"
  2517.                 ;;
  2518.             short )
  2519.                 echo "$version.$revision$bptype$bplevel"
  2520.                 ;;
  2521.             libtool )
  2522.                 echo "$LTV"
  2523.                 ;;
  2524.             hex )
  2525.                 echo "0x$HEX"
  2526.                 ;;
  2527.         esac
  2528.         rm -f $tmpfile >/dev/null 2>&1
  2529.         exit 0
  2530.     fi
  2531.  
  2532.     #   create the version file according the the selected language
  2533.     echo "new version: $version.$revision$bptype$bplevel ($date)"
  2534.     case $LANGUAGE in
  2535.         txt )
  2536.             cat >$tmpfile <<'EOT'
  2537.  
  2538.   This is @NAME@, Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)
  2539. EOT
  2540.             ;;
  2541.         c )
  2542.             cat >$tmpfile <<'EOT'
  2543. /*
  2544. **  @FILE@ -- Version Information
  2545. **  [automatically generated and maintained by shtool]
  2546. */
  2547.  
  2548. #ifdef _AS_HEADER
  2549.  
  2550. #ifndef _@FILESTR@
  2551. #define _@FILESTR@
  2552. #define @PREFIX@_VERSION 0x@HEX@
  2553. extern const int  @PREFIX@_Version;
  2554. extern const char @PREFIX@_VersionStr[];
  2555. extern const char @PREFIX@_Hello[];
  2556. extern const char @PREFIX@_GNUVersion[];
  2557. extern const char @PREFIX@_WhatID[];
  2558. extern const char @PREFIX@_RCSIdentID[];
  2559. extern const char @PREFIX@_WebID[];
  2560. extern const char @PREFIX@_PlainID[];
  2561. #endif /* _@FILESTR@ */
  2562.  
  2563. #else
  2564.  
  2565. const int  @PREFIX@_Version      = 0x@HEX@;
  2566. const char @PREFIX@_VersionStr[] = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
  2567. const char @PREFIX@_Hello[]      = "This is @NAME@, Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
  2568. const char @PREFIX@_GNUVersion[] = "@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
  2569. const char @PREFIX@_WhatID[]     = "@(#)@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
  2570. const char @PREFIX@_RCSIdentID[] = "$Id: @NAME@ @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ @DAY@-@MONTH@-@YEAR@ $";
  2571. const char @PREFIX@_WebID[]      = "@NAME@/@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
  2572. const char @PREFIX@_PlainID[]    = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
  2573.  
  2574. #endif
  2575. EOT
  2576.             ;;
  2577.         perl )
  2578.             cat >$tmpfile <<'EOT'
  2579. ##
  2580. ##  @FILE@ -- Version Information
  2581. ##  [automatically generated and maintained by shtool]
  2582. ##
  2583.  
  2584. $@PREFIX@_Version    = 0x@HEX@;
  2585. $@PREFIX@_VersionStr = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
  2586. $@PREFIX@_Hello      = "This is @NAME@, Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
  2587. $@PREFIX@_GNUVersion = "@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
  2588. $@PREFIX@_WhatID     = "@(#)@NAME@ Version @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ (@DAY@-@MONTH@-@YEAR@)";
  2589. $@PREFIX@_RCSIdentID = "\$Id: @NAME@ @VERSION@.@REVISION@@BPTYPE@@BPLEVEL@ @DAY@-@MONTH@-@YEAR@ $/";
  2590. $@PREFIX@_WebID      = "@NAME@/@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
  2591. $@PREFIX@_PlainID    = "@VERSION@.@REVISION@@BPTYPE@@BPLEVEL@";
  2592.  
  2593. 1;
  2594. EOT
  2595.             ;;
  2596.     esac
  2597.  
  2598.     #   now create the version file
  2599.     rm -f $FILE >/dev/null 2>&1
  2600.     sed \
  2601.         -e "s|@FILE@|$FILE|g" \
  2602.         -e "s|@FILESTR@|$FILESTR|g" \
  2603.         -e "s|@PREFIX@|$PREFIX|g" \
  2604.         -e "s|@NAME@|$NAME|g" \
  2605.         -e "s|@HEX@|$HEX|g" \
  2606.         -e "s|@VERSION@|$version|g" \
  2607.         -e "s|@REVISION@|$revision|g" \
  2608.         -e "s|@BPTYPE@|$bptype|g" \
  2609.         -e "s|@BPLEVEL@|$bplevel|g" \
  2610.         -e "s|@YEAR@|$year|g" \
  2611.         -e "s|@MONTH@|$month|g" \
  2612.         -e "s|@DAY@|$day|g" <$tmpfile >$FILE
  2613.     rm -f $tmpfile >/dev/null 2>&1
  2614.     exit 0
  2615.     ;;
  2616.  
  2617. path )
  2618.     ##
  2619.     ##  path -- Deal with program paths
  2620.     ##  Copyright (c) 1998-2000 Ralf S. Engelschall <rse@engelschall.com>
  2621.     ##  Originally written for Apache
  2622.     ##
  2623.  
  2624.     namelist="$*"
  2625.  
  2626.     #   check whether the test command supports the -x option
  2627.     cat >$tmpfile <<EOT
  2628. if [ -x / ] || [ -x /bin ] || [ -x /bin/ls ]; then
  2629.     exit 0
  2630. fi
  2631. exit 1
  2632. EOT
  2633.     if sh $tmpfile 2>/dev/null; then
  2634.         minusx="-x"
  2635.     else
  2636.         minusx="-r"
  2637.     fi
  2638.     rm -f $tmpfile
  2639.  
  2640.     #   split path string
  2641.     paths="`echo $opt_p |\
  2642.             sed -e 's/^:/.:/' \
  2643.                 -e 's/::/:.:/g' \
  2644.                 -e 's/:$/:./' \
  2645.                 -e 's/:/ /g'`"
  2646.  
  2647.     #   SPECIAL REQUEST
  2648.     #   translate forward to reverse path
  2649.     if [ ".$opt_r" = .yes ]; then
  2650.         if [ "x$namelist" = "x." ]; then
  2651.             rp='.'
  2652.         else
  2653.             rp=''
  2654.             for pe in `IFS="$IFS/"; echo $namelist`; do
  2655.                 rp="../$rp"
  2656.             done
  2657.         fi
  2658.         echo $rp | sed -e 's:/$::'
  2659.         exit 0
  2660.     fi
  2661.  
  2662.     #   SPECIAL REQUEST
  2663.     #   strip out directory or base name
  2664.     if [ ".$opt_d" = .yes ]; then
  2665.         echo "$namelist" |\
  2666.         sed -e 's;[^/]*$;;' -e 's;\(.\)/$;\1;'
  2667.         exit 0
  2668.     fi
  2669.     if [ ".$opt_b" = .yes ]; then
  2670.         echo "$namelist" |\
  2671.         sed -e 's;.*/\([^/]*\)$;\1;'
  2672.         exit 0
  2673.     fi
  2674.  
  2675.     #   MAGIC SITUATION
  2676.     #   Perl Interpreter (perl)
  2677.     if [ ".$opt_m" = .yes ] && [ ".$namelist" = .perl ]; then
  2678.         rm -f $tmpfile
  2679.         touch $tmpfile
  2680.         c=0
  2681.         found=0
  2682.         for dir in $paths; do
  2683.             dir=`echo $dir | sed -e 's;/*$;;'`
  2684.             for perl in perl5 perl miniperl; do
  2685.                  if [ $minusx "$dir/$perl" ] && [ ! -d "$dir/$perl" ]; then
  2686.                      perl="$dir/$perl"
  2687.                      version=`$perl -v | grep version |\
  2688.                               sed -e 's/.* version //' -e 's/ built.*//' -e 's/ with.*//'`
  2689.                      versionnum="`echo $version | sed -e 's/\.//g' -e 's/_//g'`"
  2690.                      versionnum=`expr $versionnum - $c`
  2691.                      echo "$versionnum $perl" >>$tmpfile
  2692.                      found=1
  2693.                  fi
  2694.             done
  2695.             c=`expr $c + 1`
  2696.         done
  2697.         if [ $found = 1 ]; then
  2698.             perl="`cat $tmpfile | sort -u | tail -1 | cut '-d ' -f2`"
  2699.             rm -f $tmpfile
  2700.             echo "$perl"
  2701.             exit 0
  2702.         fi
  2703.         exit 1
  2704.     fi
  2705.  
  2706.     #   MAGIC SITUATION
  2707.     #   C pre-processor (cpp)
  2708.     if [ ".$opt_m" = .yes ] && [ ".$namelist" = .cpp ]; then
  2709.         cat >$tmpfile.c <<EOT
  2710. #include <assert.h>
  2711.     Syntax Error
  2712. EOT
  2713.         #   1. try the standard cc -E approach
  2714.         cpp="${CC-cc} -E"
  2715.         (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
  2716.         my_error=`grep -v '^ *+' $tmpfile.out`
  2717.         if [ ".$my_error" != . ]; then
  2718.             #   2. try the cc -E approach and GCC's -traditional-ccp option
  2719.             cpp="${CC-cc} -E -traditional-cpp"
  2720.             (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
  2721.             my_error=`grep -v '^ *+' $tmpfile.out`
  2722.             if [ ".$my_error" != . ]; then
  2723.                 #   3. try a standalone cpp command in path and lib dirs
  2724.                 for path in $paths /lib /usr/lib /usr/local/lib; do
  2725.                     path=`echo $path | sed -e 's;/*$;;'`
  2726.                     if [ $minusx "$path/cpp" ] && [ ! -d "$path/cpp" ]; then
  2727.                         cpp="$path/cpp"
  2728.                         break
  2729.                     fi
  2730.                 done
  2731.                 if [ ".$cpp" != . ]; then
  2732.                     (eval "$cpp $tmpfile.c >/dev/null") 2>$tmpfile.out
  2733.                     my_error=`grep -v '^ *+' $tmpfile.out`
  2734.                     if [ ".$my_error" != . ]; then
  2735.                         #   ok, we gave up...
  2736.                         cpp=''
  2737.                     fi
  2738.                 fi
  2739.             fi
  2740.         fi
  2741.         rm -f $tmpfile.c $tmpfile.out
  2742.         if [ ".$cpp" != . ]; then
  2743.             echo "$cpp"
  2744.             exit 0
  2745.         fi
  2746.         exit 1
  2747.     fi
  2748.  
  2749.     #   STANDARD SITUATION
  2750.     #   iterate over names
  2751.     for name in $namelist; do
  2752.         #   iterate over paths
  2753.         for path in $paths; do
  2754.             path=`echo $path | sed -e 's;/*$;;'`
  2755.             if [ $minusx "$path/$name" ] && [ ! -d "$path/$name" ]; then
  2756.                 if [ ".$opt_s" != .yes ]; then
  2757.                     echo "$path/$name" 2>&1
  2758.                 fi
  2759.                 exit 0
  2760.             fi
  2761.         done
  2762.     done
  2763.     exit 1
  2764.     ;;
  2765.  
  2766. esac
  2767.  
  2768. exit 0
  2769.  
  2770. ##EOF##
  2771.